foop
Version:
interfaces that describe their intentions.
66 lines (59 loc) • 5.6 kB
JavaScript
/* eslint consistent-this: ["error", "Klass"] */
var ENV_DEBUG = require('../env/debug')
var standardReleaser = require('./standardReleaser')
var oneArgumentPooler = require('./oneArgumentPooler')
/**
* @symb 🎱
* @member pooler
* @type {Object}
*
* {@link https://github.com/atheros/node-advanced-pool node-advanced-pool}
*
* {@link https://github.com/facebook/react/blob/master/src/renderers/shared/utils/PooledClass.js react-pooler}
* @see {@link react-pooler}
*
* @tests deps/pooler
* @types deps.cache.pooler
*/
var DEFAULT_POOLER = oneArgumentPooler
var DEFAULT_POOL_SIZE = 10
/**
* Augments `CopyConstructor` to be a poolable class, augmenting only the class
* itself (statically) not adding any prototypical fields. Any CopyConstructor
* you give this may have a `poolSize` property, and will look for a
* prototypical `destructor` on instances.
*
* @since 5.0.0
* @memberOf pooler
*
* @param {Function | Object} CopyConstructor Constructor that can be used to reset.
* @param {Function} pooler Customizable pooler.
* @return {Object} enhanced constructor, decorated with pooler
*
* @prop {Array} instancePool
* @prop {number} poolSize
* @prop {Function} release
* @prop {Function} getPooled
*
* @example
*
* class Eh {}
* addPoolingTo(Eh) // can optionally pass in pooler as second arg
* //=> Eh.instancePool = []
* //=> Eh.getPooled = pooler || singleArgumentPooler
* //=> Eh.poolSize = 10
* //=> Eh.release = standardReleaser
*
*/
function addPoolingTo(CopyConstructor, pooler) {
// Casting as any so that flow ignores the actual implementation and trusts
// it to match the type we declared
var NewKlass = CopyConstructor
NewKlass.instancePool = []
NewKlass.getPooled = pooler || DEFAULT_POOLER
if (!NewKlass.poolSize) { NewKlass.poolSize = DEFAULT_POOL_SIZE }
NewKlass.release = standardReleaser
return NewKlass
}
module.exports = addPoolingTo
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9vbGVyLmpzIiwic291cmNlcyI6WyJwb29sZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50IGNvbnNpc3RlbnQtdGhpczogW1wiZXJyb3JcIiwgXCJLbGFzc1wiXSAqL1xuXG5jb25zdCBFTlZfREVCVUcgPSByZXF1aXJlKCcuLi9lbnYvZGVidWcnKVxuY29uc3Qgc3RhbmRhcmRSZWxlYXNlciA9IHJlcXVpcmUoJy4vc3RhbmRhcmRSZWxlYXNlcicpXG5jb25zdCBvbmVBcmd1bWVudFBvb2xlciA9IHJlcXVpcmUoJy4vb25lQXJndW1lbnRQb29sZXInKVxuXG4vKipcbiAqIEBzeW1iIPCfjrFcbiAqIEBtZW1iZXIgcG9vbGVyXG4gKiBAdHlwZSB7T2JqZWN0fVxuICpcbiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXRoZXJvcy9ub2RlLWFkdmFuY2VkLXBvb2wgbm9kZS1hZHZhbmNlZC1wb29sfVxuICpcbiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvYmxvYi9tYXN0ZXIvc3JjL3JlbmRlcmVycy9zaGFyZWQvdXRpbHMvUG9vbGVkQ2xhc3MuanMgcmVhY3QtcG9vbGVyfVxuICogQHNlZSB7QGxpbmsgcmVhY3QtcG9vbGVyfVxuICpcbiAqIEB0ZXN0cyBkZXBzL3Bvb2xlclxuICogQHR5cGVzIGRlcHMuY2FjaGUucG9vbGVyXG4gKi9cbmNvbnN0IERFRkFVTFRfUE9PTEVSID0gb25lQXJndW1lbnRQb29sZXJcbmNvbnN0IERFRkFVTFRfUE9PTF9TSVpFID0gMTBcblxuLyoqXG4gKiBBdWdtZW50cyBgQ29weUNvbnN0cnVjdG9yYCB0byBiZSBhIHBvb2xhYmxlIGNsYXNzLCBhdWdtZW50aW5nIG9ubHkgdGhlIGNsYXNzXG4gKiBpdHNlbGYgKHN0YXRpY2FsbHkpIG5vdCBhZGRpbmcgYW55IHByb3RvdHlwaWNhbCBmaWVsZHMuIEFueSBDb3B5Q29uc3RydWN0b3JcbiAqIHlvdSBnaXZlIHRoaXMgbWF5IGhhdmUgYSBgcG9vbFNpemVgIHByb3BlcnR5LCBhbmQgd2lsbCBsb29rIGZvciBhXG4gKiBwcm90b3R5cGljYWwgYGRlc3RydWN0b3JgIG9uIGluc3RhbmNlcy5cbiAqXG4gKiBAc2luY2UgNS4wLjBcbiAqIEBtZW1iZXJPZiBwb29sZXJcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9uIHwgT2JqZWN0fSBDb3B5Q29uc3RydWN0b3IgQ29uc3RydWN0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byByZXNldC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHBvb2xlciBDdXN0b21pemFibGUgcG9vbGVyLlxuICogQHJldHVybiB7T2JqZWN0fSBlbmhhbmNlZCBjb25zdHJ1Y3RvciwgZGVjb3JhdGVkIHdpdGggcG9vbGVyXG4gKlxuICogQHByb3Age0FycmF5fSBpbnN0YW5jZVBvb2xcbiAqIEBwcm9wIHtudW1iZXJ9IHBvb2xTaXplXG4gKiBAcHJvcCB7RnVuY3Rpb259IHJlbGVhc2VcbiAqIEBwcm9wIHtGdW5jdGlvbn0gZ2V0UG9vbGVkXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICBjbGFzcyBFaCB7fVxuICogICAgYWRkUG9vbGluZ1RvKEVoKSAvLyBjYW4gb3B0aW9uYWxseSBwYXNzIGluIHBvb2xlciBhcyBzZWNvbmQgYXJnXG4gKiAgICAvLz0+IEVoLmluc3RhbmNlUG9vbCA9IFtdXG4gKiAgICAvLz0+IEVoLmdldFBvb2xlZCA9IHBvb2xlciB8fCBzaW5nbGVBcmd1bWVudFBvb2xlclxuICogICAgLy89PiBFaC5wb29sU2l6ZSA9IDEwXG4gKiAgICAvLz0+IEVoLnJlbGVhc2UgPSBzdGFuZGFyZFJlbGVhc2VyXG4gKlxuICovXG5mdW5jdGlvbiBhZGRQb29saW5nVG8oQ29weUNvbnN0cnVjdG9yLCBwb29sZXIpIHtcbiAgLy8gQ2FzdGluZyBhcyBhbnkgc28gdGhhdCBmbG93IGlnbm9yZXMgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBhbmQgdHJ1c3RzXG4gIC8vIGl0IHRvIG1hdGNoIHRoZSB0eXBlIHdlIGRlY2xhcmVkXG4gIGNvbnN0IE5ld0tsYXNzID0gQ29weUNvbnN0cnVjdG9yXG5cbiAgTmV3S2xhc3MuaW5zdGFuY2VQb29sID0gW11cbiAgTmV3S2xhc3MuZ2V0UG9vbGVkID0gcG9vbGVyIHx8IERFRkFVTFRfUE9PTEVSXG4gIGlmICghTmV3S2xhc3MucG9vbFNpemUpIE5ld0tsYXNzLnBvb2xTaXplID0gREVGQVVMVF9QT09MX1NJWkVcbiAgTmV3S2xhc3MucmVsZWFzZSA9IHN0YW5kYXJkUmVsZWFzZXJcblxuICByZXR1cm4gTmV3S2xhc3Ncbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhZGRQb29saW5nVG9cbiJdLCJuYW1lcyI6WyJjb25zdCJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUFBLEdBQUssQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztBQUN6Q0EsR0FBSyxDQUFDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQztBQUN0REEsR0FBSyxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBZXhEQSxHQUFLLENBQUMsY0FBYyxHQUFHLGlCQUFpQjtBQUN4Q0EsR0FBSyxDQUFDLGlCQUFpQixHQUFHLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQThCNUIsU0FBUyxZQUFZLENBQUMsZUFBZSxFQUFFLE1BQU0sRUFBRTs7O0VBRzdDQSxHQUFLLENBQUMsUUFBUSxHQUFHLGVBQWU7O0VBRWhDLFFBQVEsQ0FBQyxZQUFZLEdBQUcsRUFBRTtFQUMxQixRQUFRLENBQUMsU0FBUyxHQUFHLE1BQU0sSUFBSSxjQUFjO0VBQzdDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUEsUUFBUSxDQUFDLFFBQVEsR0FBRyxpQkFBaUIsRUFBQTtFQUM3RCxRQUFRLENBQUMsT0FBTyxHQUFHLGdCQUFnQjs7RUFFbkMsT0FBTyxRQUFRO0NBQ2hCOztBQUVELE1BQU0sQ0FBQyxPQUFPLEdBQUcsWUFBWTsifQ==