0
0
mirror of https://github.com/cjdelisle/cjdns synced 2025-10-06 00:32:50 +02:00
Files
cjdns/node_modules/saferphore/index.js

51 lines
1.5 KiB
JavaScript

/*@flow*/
/*::
export type Saferphore_ReturnAfter_t = ((...any)=>void)=>(...any)=>void;
export type Saferphore_t = {
take: ((Saferphore_ReturnAfter_t)=>void)=>void,
};
*/
;(function () {
"use strict";
var create = function (resourceCount /*:number*/) /*:Saferphore_t*/ {
var queue = [];
var check;
var mkRa = function () /*:Saferphore_ReturnAfter_t*/ {
var outerCalled = 0;
return function (func) {
if (outerCalled++) { throw new Error("returnAfter() called multiple times"); }
var called = 0;
return function () {
if (called++) {
throw new Error("returnAfter wrapped callback called multiple times");
}
if (func) { func.apply(null, arguments); }
resourceCount++;
check();
};
};
};
check = function () {
if (resourceCount < 0) { throw new Error("(resourceCount < 0) should never happen"); }
if (resourceCount === 0 || queue.length === 0) { return; }
resourceCount--;
queue.shift()(mkRa());
};
return {
take: function (func) {
queue.push(func);
check();
}
};
};
if (typeof(window) === 'object') {
if (window.define && window.define.amd) {
window.define({ create: create });
} else {
window.Saferphore = { create: create };
}
} else if (typeof(module) === 'object' && module.exports) {
module.exports.create = create;
}
}());