From e018e8dfe4f920e3d9604d956e538f0d019c8e9f Mon Sep 17 00:00:00 2001 From: "Lin, Hung-Shin" Date: Thu, 16 Nov 2023 12:46:30 +0800 Subject: [PATCH] refactor: encapsulate DAG --- .eslintrc.js | 2 +- packages/utils/dag.js | 50 ++++++++++++++++++++++---------------- packages/utils/dag.test.js | 28 ++++++++++----------- 3 files changed, 44 insertions(+), 36 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 1d3cb3d..7410a96 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -13,7 +13,7 @@ module.exports = { ], parserOptions: { // parser: 'babel-eslint', - ecmaVersion: 2020, + ecmaVersion: 13, sourceType: 'module', }, rules: { diff --git a/packages/utils/dag.js b/packages/utils/dag.js index 79aa95d..de95372 100644 --- a/packages/utils/dag.js +++ b/packages/utils/dag.js @@ -1,53 +1,61 @@ export default class DAG { + #nodes = new Map() + + #edges = new Set() + + #layers = [] + constructor(nodes) { - this.nodes = new Map(nodes.map((node) => [node._id, node])) - this.edges = new Set() - this.layers = [] - this.nodes.forEach((_, id) => { - this.setLayer(id) - this.addEdges(id) + this.#nodes = new Map(nodes.map((node) => [node._id, node])) + this.#edges = new Set() + this.#nodes.forEach((_, id) => { + this.#setLayer(id) + this.#addEdges(id) }) } - get(id) { - return this.nodes.get(id) + getNode(id) { + return this.#nodes.get(id) } getNodes() { - return Array.from(this.nodes.values()) + return Array.from(this.#nodes.values()) } getEdges() { - return Array.from(this.edges.values()) + return this.#edges } - setLayer(id) { - console.log(`setLayer(${id})`) - const node = this.nodes.get(id) + getEdgesArray() { + return Array.from(this.#edges.values()) + } + + #setLayer(id) { + const node = this.getNode(id) if (!node) { throw new Error(`Node ${id} not found`) } if (node.layer !== undefined) { return node.layer } - const previousLayer = node.requirements.map((rId) => this.setLayer(rId)) + const previousLayer = node.requirements.map((rId) => this.#setLayer(rId)) node.layer = Math.max(...previousLayer, 0) + 1 - if (this.layers.length < node.layer) { - this.layer.push(1) + if (this.#layers.length < node.layer) { + this.#layers.push(1) } else { - this.layers[node.layer - 1] += 1 + this.#layers[node.layer - 1] += 1 } - node.count = this.layers[node.layer - 1] + node.index = this.#layers[node.layer - 1] return node.layer } - addEdges(id) { - const node = this.nodes.get(id) + #addEdges(id) { + const node = this.getNode(id) if (!node) { throw new Error(`Node ${id} not found`) } node.requirements.forEach((rId) => { - this.edges.add([rId, id]) + this.#edges.add([rId, id]) }) } } diff --git a/packages/utils/dag.test.js b/packages/utils/dag.test.js index 2e222c7..ba42757 100644 --- a/packages/utils/dag.test.js +++ b/packages/utils/dag.test.js @@ -13,8 +13,8 @@ describe('dag layers', () => { }, ] const dag = new DAG(data) - expect(dag.get('helloworld').layer).toBe(1) - expect(dag.get('spell').layer).toBe(2) + expect(dag.getNode('helloworld').layer).toBe(1) + expect(dag.getNode('spell').layer).toBe(2) }) it('branch', () => { const data = [ @@ -32,9 +32,9 @@ describe('dag layers', () => { }, ] const dag = new DAG(data) - expect(dag.get('helloworld').layer).toBe(1) - expect(dag.get('spell').layer).toBe(2) - expect(dag.get('discover').layer).toBe(2) + expect(dag.getNode('helloworld').layer).toBe(1) + expect(dag.getNode('spell').layer).toBe(2) + expect(dag.getNode('discover').layer).toBe(2) }) it('merge', () => { const data = [ @@ -52,9 +52,9 @@ describe('dag layers', () => { }, ] const dag = new DAG(data) - expect(dag.get('A').layer).toBe(1) - expect(dag.get('B').layer).toBe(1) - expect(dag.get('C').layer).toBe(2) + expect(dag.getNode('A').layer).toBe(1) + expect(dag.getNode('B').layer).toBe(1) + expect(dag.getNode('C').layer).toBe(2) }) it('skip', () => { const data = [ @@ -76,10 +76,10 @@ describe('dag layers', () => { }, ] const dag = new DAG(data) - expect(dag.get('A').layer).toBe(1) - expect(dag.get('B').layer).toBe(1) - expect(dag.get('C').layer).toBe(2) - expect(dag.get('D').layer).toBe(3) + expect(dag.getNode('A').layer).toBe(1) + expect(dag.getNode('B').layer).toBe(1) + expect(dag.getNode('C').layer).toBe(2) + expect(dag.getNode('D').layer).toBe(3) }) }) @@ -97,7 +97,7 @@ describe('dag edges', () => { ] const dag = new DAG(data) - expect(dag.edges).toEqual(new Set([['helloworld', 'spell']])) + expect(dag.getEdges()).toEqual(new Set([['helloworld', 'spell']])) }) it('branch edges', () => { @@ -117,7 +117,7 @@ describe('dag edges', () => { ] const dag = new DAG(data) - expect(dag.edges).toEqual( + expect(dag.getEdges()).toEqual( new Set([ ['helloworld', 'discover'], ['helloworld', 'spell'],