pooled
Version:
mutate constructors into a poolable form
71 lines (44 loc) • 1.78 kB
Markdown
# pooled
turn a javascript constructor into a pooled resource that can be
`attain`'d and `release`'d (to reduce garbage generation by reusing
objects; useful in games where you want to avoid GC at all costs).
```javascript
function Point(x, y, z) {
this.x = x
this.y = y
this.z = z
}
Point.prototype.onrelease = function() {
console.log('released')
}
Point = pooled(Point)
var p = Point(0, 0, 0)
p.release() // -> "released"
console.log(Point.pooled()) // -> 1
var p2 = Point(12, 12, 12)
console.log(Point.pooled()) // -> 0
console.log(Point.extant()) // -> 1
console.log(p2 === p) // true
Point.allocate(100, 12, 21, 1) // preallocate 100 Point objects
// with arguments
```
## API
#### newcons = pooled(cons[, shouldSeal=false])
Create a pooled constructor from an existing constructor.
If `shouldSeal` is true, resultant objects will be `Object.seal`'d before being returned.
#### newcons.attain(arg1, arg2, arg3) -> instance
#### newcons(arg1, arg2, arg3...) -> instance
Forward the arguments to the original constructor and create a new instance.
#### newcons.extant() -> number
Get the number of currently held instances of `newcons`.
#### newcons.pooled() -> number
Get the number of currently pooled (released) instances of `newcons`.
#### newcons.allocate(number[, default, arguments, go, here]) -> number
Allocate `number` new `newcons` instances into the pool. Forward the provided arguments to them.
Returns the number of currently pooled objects.
#### instance.release()
Releases this instance. You should get rid of the reference to it in your code,
as some other code might reuse this object at later point.
If there is an `onrelease` method on the object, it'll get called.
## License
MIT