smart-factory
Version:
functional programming-ready dependancy injector/ioc container library
57 lines • 2.53 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const lodash_1 = require("lodash");
const instantiator = (logger, instances) => (candidates) => __awaiter(this, void 0, void 0, function* () {
const baseTime = Date.now();
logger.debug('* instantiating..');
const graph = exports.graphize(candidates);
logger.debug('* dependency graph created');
const map = new Map();
const fail = new Map();
graph.map((n) => map.set(n.key, n));
graph.map((n) => fail.set(n.key, false));
const queue = [graph[0].key];
while (queue.length > 0) {
const node = map.get(queue.pop());
const deps = node.to.map((d) => instances.get(d));
node.to.map((d) => !instances.get(d) ?
exports.pushNoDuplicate(queue, fail, d) : null);
if (lodash_1.every(deps) === true) {
const deps = node.to.map((d) => instances.get(d));
const instance = yield node.instantiator.apply(this, deps);
const elapsed = Date.now() - baseTime;
fail.set(node.key, false);
instances.set(node.key, instance);
logger.debug(`* dependency resolved: ${node.key}, elapsed time: ${elapsed} ms`);
node.from.map((d) => {
if (!instances.get(d)) {
exports.pushNoDuplicate(queue, fail, d);
}
});
}
}
});
exports.default = instantiator;
exports.pushNoDuplicate = (queue, fail, elem) => lodash_1.includes(queue, elem) ? null :
fail.get(elem) ? null : queue.push(elem);
exports.graphize = (candidates) => {
const graph = candidates.map((c) => ({
key: c.key,
to: c.deps,
from: [],
instantiator: c.instantiator
}));
candidates.map((c) => c.deps.map((d) => {
lodash_1.find(graph, { key: d }).from.push(c.key);
}));
return graph;
};
//# sourceMappingURL=instantiator.js.map