UNPKG

smart-factory

Version:

functional programming-ready dependancy injector/ioc container library

57 lines 2.53 kB
"use strict"; 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