UNPKG

@typed/content-hash

Version:

Content hash a directory of HTML/JS/CSS files and other static assets

50 lines 1.91 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getStronglyConnectedComponents = void 0; const toDependencyMap_1 = require("./toDependencyMap"); function getStronglyConnectedComponents(graph) { const indices = new Map(); const lowlinks = new Map(); const onStack = new Set(); const stack = []; const stronglyConnectedComponents = []; const dependencyMap = (0, toDependencyMap_1.toDependencyMap)(graph); let index = 0; for (const v of dependencyMap.keys()) { if (!indices.has(v)) { strongConnect(v); } } return stronglyConnectedComponents; function strongConnect(v) { indices.set(v, index); lowlinks.set(v, index++); stack.push(v); onStack.add(v); const dependencies = dependencyMap.get(v); if (dependencies) { for (const dependency of dependencies) { const hasNotBeenSeenBefore = !indices.has(dependency); if (hasNotBeenSeenBefore) { strongConnect(dependency); } if (hasNotBeenSeenBefore || onStack.has(dependency)) { const depIndex = hasNotBeenSeenBefore ? lowlinks.get(dependency) : indices.get(dependency); lowlinks.set(v, Math.min(lowlinks.get(v), depIndex)); } } } if (lowlinks.get(v) === indices.get(v)) { const vertices = new Set(); let current = null; while (v !== current) { current = stack.pop(); onStack.delete(current); vertices.add(current); } stronglyConnectedComponents.push(Array.from(vertices)); } } } exports.getStronglyConnectedComponents = getStronglyConnectedComponents; //# sourceMappingURL=getStronglyConnectedComponents.js.map