{"version":3,"file":"dag-map.umd.js","sources":["dag-map.ts"],"sourcesContent":["export interface Callback {\n (key: string, value: T | undefined): void;\n}\n\nexport type MaybeStringOrArray = string | string[] | undefined;\n\n/**\n * A topologically ordered map of key/value pairs with a simple API for adding constraints.\n *\n * Edges can forward reference keys that have not been added yet (the forward reference will\n * map the key to undefined).\n */\nexport default class DAG {\n private _vertices = new Vertices();\n\n /**\n * Adds a key/value pair with dependencies on other key/value pairs.\n *\n * @public\n * @param key The key of the vertex to be added.\n * @param value The value of that vertex.\n * @param before A key or array of keys of the vertices that must\n * be visited before this vertex.\n * @param after An string or array of strings with the keys of the\n * vertices that must be after this vertex is visited.\n */\n public add(key: string, value: T | undefined, before?: MaybeStringOrArray, after?: MaybeStringOrArray) {\n if (!key) throw new Error('argument `key` is required');\n let vertices = this._vertices;\n let v = vertices.add(key);\n v.val = value;\n if (before) {\n if (typeof before === \"string\") {\n vertices.addEdge(v, vertices.add(before));\n } else {\n for (let i = 0; i < before.length; i++) {\n vertices.addEdge(v, vertices.add(before[i]));\n }\n }\n }\n if (after) {\n if (typeof after === \"string\") {\n vertices.addEdge(vertices.add(after), v);\n } else {\n for (let i = 0; i < after.length; i++) {\n vertices.addEdge(vertices.add(after[i]), v);\n }\n }\n }\n }\n\n /**\n * @deprecated please use add.\n */\n public addEdges(key: string, value: T | undefined, before?: MaybeStringOrArray, after?: MaybeStringOrArray) {\n this.add(key, value, before, after);\n }\n\n /**\n * Visits key/value pairs in topological order.\n *\n * @public\n * @param callback The function to be invoked with each key/value.\n */\n public each(callback: Callback) {\n this._vertices.walk(callback);\n }\n\n /**\n * @deprecated please use each.\n */\n public topsort(callback: Callback) {\n this.each(callback);\n }\n}\n\n\n/** @private */\nclass Vertices {\n [index: number]: Vertex;\n length = 0;\n\n private stack: IntStack = new IntStack();\n private path: IntStack = new IntStack();\n private result: IntStack = new IntStack();\n\n public add(key: string): Vertex {\n if (!key) throw new Error(\"missing key\");\n let l = this.length | 0;\n let vertex: Vertex;\n for (let i = 0; i < l; i++) {\n vertex = this[i];\n if (vertex.key === key) return vertex;\n }\n this.length = l + 1;\n return this[l] = {\n idx: l,\n key: key,\n val: undefined,\n out: false,\n flag: false,\n length: 0\n };\n }\n\n public addEdge(v: Vertex, w: Vertex): void {\n this.check(v, w.key);\n let l = w.length | 0;\n for (let i = 0; i < l; i++) {\n if (w[i] === v.idx) return;\n }\n w.length = l + 1;\n w[l] = v.idx;\n v.out = true;\n }\n\n public walk(cb: Callback): void {\n this.reset();\n for (let i = 0; i < this.length; i++) {\n let vertex = this[i];\n if (vertex.out) continue;\n this.visit(vertex, \"\");\n }\n this.each(this.result, cb);\n }\n\n private check(v: Vertex, w: string): void {\n if (v.key === w) {\n throw new Error(\"cycle detected: \" + w + \" <- \" + w);\n }\n // quick check\n if (v.length === 0) return;\n // shallow check\n for (let i = 0; i < v.length; i++) {\n let key = this[v[i]].key;\n if (key === w) {\n throw new Error(\"cycle detected: \" + w + \" <- \" + v.key + \" <- \" + w);\n }\n }\n // deep check\n this.reset();\n this.visit(v, w);\n if (this.path.length > 0) {\n let msg = \"cycle detected: \" + w;\n this.each(this.path, (key) => {\n msg += \" <- \" + key;\n });\n throw new Error(msg);\n }\n }\n\n private reset(): void {\n this.stack.length = 0;\n this.path.length = 0;\n this.result.length = 0;\n for (let i = 0, l = this.length; i < l; i++) {\n this[i].flag = false;\n }\n }\n\n private visit(start: Vertex, search: string): void {\n let { stack, path, result } = this;\n stack.push(start.idx);\n while (stack.length) {\n let index = stack.pop() | 0;\n if (index >= 0) {\n // enter\n let vertex = this[index];\n if (vertex.flag) continue;\n vertex.flag = true;\n path.push(index);\n if (search === vertex.key) break;\n // push exit\n stack.push(~index);\n this.pushIncoming(vertex);\n } else {\n // exit\n path.pop();\n result.push(~index);\n }\n }\n }\n\n private pushIncoming(incomming: ArrayLike): void {\n let { stack } = this;\n for (let i = incomming.length - 1; i >= 0; i--) {\n let index = incomming[i];\n if (!this[index].flag) {\n stack.push(index);\n }\n }\n }\n\n private each(indices: IntStack, cb: Callback): void {\n for (let i = 0, l = indices.length; i < l; i++) {\n let vertex = this[indices[i]];\n cb(vertex.key, vertex.val);\n }\n }\n}\n\n/** @private */\ninterface Vertex {\n idx: number;\n key: string;\n val: T | undefined;\n out: boolean;\n flag: boolean;\n [index: number]: number;\n length: number;\n}\n\n/** @private */\nclass IntStack {\n [index: number]: number;\n public length = 0;\n\n push(n: number) {\n this[this.length++] = n | 0;\n }\n\n pop() {\n return this[--this.length] | 0;\n }\n}\n"],"names":[],"mappings":"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"}