import { UnaryFunction } from 'rxjs'; export type OutboundEdges = UnaryFunction; function _visitNodes(aNodes: T[], aEdges: OutboundEdges, aSet: Set) { // iterate over all nodes if (aNodes && (aNodes.length > 0)) { // iterate aNodes.forEach(node => { // check if we know the node if (!aSet.has(node)) { // add the node aSet.add(node); // recurse _visitNodes(aEdges(node), aEdges, aSet); } }); } } export function connectedComponents(aNodes: T[], aEdges: OutboundEdges): T[] { // set of visited nodes const result = new Set(); // recurse _visitNodes(aNodes, aEdges, result); // convert return Array.from(result.keys()); }