@zengrid/shared 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/README.md +44 -0
- package/dist/index.cjs.default.js +1 -0
- package/dist/index.cjs.js +6250 -0
- package/dist/index.cjs.mjs +2 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.esm.js +6207 -0
- package/dist/package.json +54 -0
- package/dist/src/algorithms/filter/bloom-filter.d.ts +120 -0
- package/dist/src/algorithms/filter/bloom-filter.d.ts.map +1 -0
- package/dist/src/algorithms/filter/index.d.ts +7 -0
- package/dist/src/algorithms/filter/index.d.ts.map +1 -0
- package/dist/src/algorithms/graph/bfs.d.ts +71 -0
- package/dist/src/algorithms/graph/bfs.d.ts.map +1 -0
- package/dist/src/algorithms/graph/dfs.d.ts +62 -0
- package/dist/src/algorithms/graph/dfs.d.ts.map +1 -0
- package/dist/src/algorithms/graph/graph.interface.d.ts +63 -0
- package/dist/src/algorithms/graph/graph.interface.d.ts.map +1 -0
- package/dist/src/algorithms/graph/index.d.ts +9 -0
- package/dist/src/algorithms/graph/index.d.ts.map +1 -0
- package/dist/src/algorithms/index.d.ts +11 -0
- package/dist/src/algorithms/index.d.ts.map +1 -0
- package/dist/src/algorithms/pattern/index.d.ts +8 -0
- package/dist/src/algorithms/pattern/index.d.ts.map +1 -0
- package/dist/src/algorithms/pattern/sequence-detector.d.ts +62 -0
- package/dist/src/algorithms/pattern/sequence-detector.d.ts.map +1 -0
- package/dist/src/algorithms/search/binary-search.d.ts +86 -0
- package/dist/src/algorithms/search/binary-search.d.ts.map +1 -0
- package/dist/src/algorithms/search/index.d.ts +6 -0
- package/dist/src/algorithms/search/index.d.ts.map +1 -0
- package/dist/src/algorithms/sorting/comparators.d.ts +126 -0
- package/dist/src/algorithms/sorting/comparators.d.ts.map +1 -0
- package/dist/src/algorithms/sorting/index.d.ts +9 -0
- package/dist/src/algorithms/sorting/index.d.ts.map +1 -0
- package/dist/src/algorithms/sorting/sorting.interface.d.ts +38 -0
- package/dist/src/algorithms/sorting/sorting.interface.d.ts.map +1 -0
- package/dist/src/algorithms/sorting/timsort.d.ts +55 -0
- package/dist/src/algorithms/sorting/timsort.d.ts.map +1 -0
- package/dist/src/data-structures/column-store/column-store.d.ts +52 -0
- package/dist/src/data-structures/column-store/column-store.d.ts.map +1 -0
- package/dist/src/data-structures/column-store/column-store.interface.d.ts +155 -0
- package/dist/src/data-structures/column-store/column-store.interface.d.ts.map +1 -0
- package/dist/src/data-structures/column-store/index.d.ts +6 -0
- package/dist/src/data-structures/column-store/index.d.ts.map +1 -0
- package/dist/src/data-structures/command-stack/command-stack.d.ts +61 -0
- package/dist/src/data-structures/command-stack/command-stack.d.ts.map +1 -0
- package/dist/src/data-structures/command-stack/command-stack.interface.d.ts +80 -0
- package/dist/src/data-structures/command-stack/command-stack.interface.d.ts.map +1 -0
- package/dist/src/data-structures/command-stack/index.d.ts +3 -0
- package/dist/src/data-structures/command-stack/index.d.ts.map +1 -0
- package/dist/src/data-structures/dependency-graph/dependency-graph.d.ts +147 -0
- package/dist/src/data-structures/dependency-graph/dependency-graph.d.ts.map +1 -0
- package/dist/src/data-structures/dependency-graph/dependency-graph.interface.d.ts +161 -0
- package/dist/src/data-structures/dependency-graph/dependency-graph.interface.d.ts.map +1 -0
- package/dist/src/data-structures/dependency-graph/index.d.ts +8 -0
- package/dist/src/data-structures/dependency-graph/index.d.ts.map +1 -0
- package/dist/src/data-structures/disjoint-set/disjoint-set.d.ts +84 -0
- package/dist/src/data-structures/disjoint-set/disjoint-set.d.ts.map +1 -0
- package/dist/src/data-structures/disjoint-set/disjoint-set.interface.d.ts +185 -0
- package/dist/src/data-structures/disjoint-set/disjoint-set.interface.d.ts.map +1 -0
- package/dist/src/data-structures/disjoint-set/index.d.ts +7 -0
- package/dist/src/data-structures/disjoint-set/index.d.ts.map +1 -0
- package/dist/src/data-structures/index-map/index-map.d.ts +150 -0
- package/dist/src/data-structures/index-map/index-map.d.ts.map +1 -0
- package/dist/src/data-structures/index-map/index-map.interface.d.ts +186 -0
- package/dist/src/data-structures/index-map/index-map.interface.d.ts.map +1 -0
- package/dist/src/data-structures/index-map/index.d.ts +6 -0
- package/dist/src/data-structures/index-map/index.d.ts.map +1 -0
- package/dist/src/data-structures/index.d.ts +36 -0
- package/dist/src/data-structures/index.d.ts.map +1 -0
- package/dist/src/data-structures/interval-tree/index.d.ts +7 -0
- package/dist/src/data-structures/interval-tree/index.d.ts.map +1 -0
- package/dist/src/data-structures/interval-tree/interval-tree.d.ts +141 -0
- package/dist/src/data-structures/interval-tree/interval-tree.d.ts.map +1 -0
- package/dist/src/data-structures/interval-tree/interval-tree.interface.d.ts +212 -0
- package/dist/src/data-structures/interval-tree/interval-tree.interface.d.ts.map +1 -0
- package/dist/src/data-structures/lru-cache/index.d.ts +3 -0
- package/dist/src/data-structures/lru-cache/index.d.ts.map +1 -0
- package/dist/src/data-structures/lru-cache/lru-cache.d.ts +134 -0
- package/dist/src/data-structures/lru-cache/lru-cache.d.ts.map +1 -0
- package/dist/src/data-structures/lru-cache/lru-cache.interface.d.ts +173 -0
- package/dist/src/data-structures/lru-cache/lru-cache.interface.d.ts.map +1 -0
- package/dist/src/data-structures/prefix-sum-array/index.d.ts +6 -0
- package/dist/src/data-structures/prefix-sum-array/index.d.ts.map +1 -0
- package/dist/src/data-structures/prefix-sum-array/prefix-sum-array.d.ts +63 -0
- package/dist/src/data-structures/prefix-sum-array/prefix-sum-array.d.ts.map +1 -0
- package/dist/src/data-structures/prefix-sum-array/prefix-sum-array.interface.d.ts +80 -0
- package/dist/src/data-structures/prefix-sum-array/prefix-sum-array.interface.d.ts.map +1 -0
- package/dist/src/data-structures/rtree/index.d.ts +8 -0
- package/dist/src/data-structures/rtree/index.d.ts.map +1 -0
- package/dist/src/data-structures/rtree/rtree.d.ts +81 -0
- package/dist/src/data-structures/rtree/rtree.d.ts.map +1 -0
- package/dist/src/data-structures/rtree/rtree.interface.d.ts +143 -0
- package/dist/src/data-structures/rtree/rtree.interface.d.ts.map +1 -0
- package/dist/src/data-structures/segment-tree/index.d.ts +4 -0
- package/dist/src/data-structures/segment-tree/index.d.ts.map +1 -0
- package/dist/src/data-structures/segment-tree/segment-tree.d.ts +134 -0
- package/dist/src/data-structures/segment-tree/segment-tree.d.ts.map +1 -0
- package/dist/src/data-structures/segment-tree/segment-tree.interface.d.ts +202 -0
- package/dist/src/data-structures/segment-tree/segment-tree.interface.d.ts.map +1 -0
- package/dist/src/data-structures/skip-list/index.d.ts +4 -0
- package/dist/src/data-structures/skip-list/index.d.ts.map +1 -0
- package/dist/src/data-structures/skip-list/skip-list.d.ts +137 -0
- package/dist/src/data-structures/skip-list/skip-list.d.ts.map +1 -0
- package/dist/src/data-structures/skip-list/skip-list.interface.d.ts +223 -0
- package/dist/src/data-structures/skip-list/skip-list.interface.d.ts.map +1 -0
- package/dist/src/data-structures/sparse-matrix/index.d.ts +6 -0
- package/dist/src/data-structures/sparse-matrix/index.d.ts.map +1 -0
- package/dist/src/data-structures/sparse-matrix/sparse-matrix.d.ts +44 -0
- package/dist/src/data-structures/sparse-matrix/sparse-matrix.d.ts.map +1 -0
- package/dist/src/data-structures/sparse-matrix/sparse-matrix.interface.d.ts +105 -0
- package/dist/src/data-structures/sparse-matrix/sparse-matrix.interface.d.ts.map +1 -0
- package/dist/src/data-structures/suffix-array/index.d.ts +3 -0
- package/dist/src/data-structures/suffix-array/index.d.ts.map +1 -0
- package/dist/src/data-structures/suffix-array/suffix-array.d.ts +102 -0
- package/dist/src/data-structures/suffix-array/suffix-array.d.ts.map +1 -0
- package/dist/src/data-structures/suffix-array/suffix-array.interface.d.ts +117 -0
- package/dist/src/data-structures/suffix-array/suffix-array.interface.d.ts.map +1 -0
- package/dist/src/data-structures/trie/index.d.ts +8 -0
- package/dist/src/data-structures/trie/index.d.ts.map +1 -0
- package/dist/src/data-structures/trie/trie.d.ts +205 -0
- package/dist/src/data-structures/trie/trie.d.ts.map +1 -0
- package/dist/src/data-structures/trie/trie.interface.d.ts +117 -0
- package/dist/src/data-structures/trie/trie.interface.d.ts.map +1 -0
- package/dist/src/index.d.ts +47 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/patterns/coordinator.d.ts +90 -0
- package/dist/src/patterns/coordinator.d.ts.map +1 -0
- package/dist/src/patterns/event-emitter.d.ts +106 -0
- package/dist/src/patterns/event-emitter.d.ts.map +1 -0
- package/dist/src/patterns/factory.d.ts +120 -0
- package/dist/src/patterns/factory.d.ts.map +1 -0
- package/dist/src/patterns/index.d.ts +21 -0
- package/dist/src/patterns/index.d.ts.map +1 -0
- package/dist/src/patterns/mediator.d.ts +116 -0
- package/dist/src/patterns/mediator.d.ts.map +1 -0
- package/dist/src/patterns/object-pool.d.ts +178 -0
- package/dist/src/patterns/object-pool.d.ts.map +1 -0
- package/dist/src/patterns/observer.d.ts +89 -0
- package/dist/src/patterns/observer.d.ts.map +1 -0
- package/dist/src/patterns/operation-mode.d.ts +75 -0
- package/dist/src/patterns/operation-mode.d.ts.map +1 -0
- package/dist/src/patterns/state-machine.d.ts +122 -0
- package/dist/src/patterns/state-machine.d.ts.map +1 -0
- package/dist/src/types/common.d.ts +56 -0
- package/dist/src/types/common.d.ts.map +1 -0
- package/dist/src/types/index.d.ts +5 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/utils/index.d.ts +7 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/timing.d.ts +104 -0
- package/dist/src/utils/timing.d.ts.map +1 -0
- package/dist/src/utils/timing.interface.d.ts +96 -0
- package/dist/src/utils/timing.interface.d.ts.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import type { IDependencyGraph, NodeId, DependencyGraphOptions, TopologicalSortResult, GraphStats } from './dependency-graph.interface';
|
|
2
|
+
/**
|
|
3
|
+
* Dependency Graph (Directed Acyclic Graph)
|
|
4
|
+
*
|
|
5
|
+
* A graph structure for tracking dependencies between nodes.
|
|
6
|
+
* Optimized for formula calculation order and cycle detection.
|
|
7
|
+
*
|
|
8
|
+
* **Time Complexity:**
|
|
9
|
+
* - Add node: O(1)
|
|
10
|
+
* - Add edge: O(1) without cycle check, O(V + E) with cycle check
|
|
11
|
+
* - Remove node: O(E) where E = edges connected to node
|
|
12
|
+
* - Topological sort: O(V + E) using Kahn's algorithm
|
|
13
|
+
* - Cycle detection: O(V + E) using DFS
|
|
14
|
+
*
|
|
15
|
+
* **Space Complexity:** O(V + E)
|
|
16
|
+
*
|
|
17
|
+
* **Use Cases:**
|
|
18
|
+
* - Formula dependencies: =SUM(A1:A10) depends on cells A1 through A10
|
|
19
|
+
* - Calculation order: Calculate dependencies before dependents
|
|
20
|
+
* - Circular reference detection: =A1 in cell A1 is invalid
|
|
21
|
+
* - Dirty cell propagation: When B1 changes, recalculate all cells that depend on B1
|
|
22
|
+
*
|
|
23
|
+
* @example Basic Formula Dependencies
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const graph = new DependencyGraph();
|
|
26
|
+
*
|
|
27
|
+
* // Cell A3 contains formula =A1+A2
|
|
28
|
+
* graph.addDependency('A3', 'A1'); // A3 depends on A1
|
|
29
|
+
* graph.addDependency('A3', 'A2'); // A3 depends on A2
|
|
30
|
+
*
|
|
31
|
+
* // Cell A4 contains formula =A3*2
|
|
32
|
+
* graph.addDependency('A4', 'A3'); // A4 depends on A3
|
|
33
|
+
*
|
|
34
|
+
* // Get calculation order
|
|
35
|
+
* const { order } = graph.topologicalSort();
|
|
36
|
+
* // order: ['A1', 'A2', 'A3', 'A4']
|
|
37
|
+
*
|
|
38
|
+
* // Detect circular reference
|
|
39
|
+
* const wouldCycle = graph.wouldCreateCycle('A1', 'A4');
|
|
40
|
+
* // wouldCycle: true (A4→A3→A1→A4 creates a cycle)
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* @example Incremental Recalculation
|
|
44
|
+
* ```typescript
|
|
45
|
+
* // User changes cell B1
|
|
46
|
+
* const affectedCells = graph.getCalculationOrder(['B1']);
|
|
47
|
+
* // Returns: ['B1', 'C1', 'D1', ...] (all cells that transitively depend on B1)
|
|
48
|
+
*
|
|
49
|
+
* // Recalculate only affected cells in correct order
|
|
50
|
+
* affectedCells.forEach(cellId => {
|
|
51
|
+
* calculateCell(cellId);
|
|
52
|
+
* });
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export declare class DependencyGraph implements IDependencyGraph {
|
|
56
|
+
/** Map of node → nodes it depends on */
|
|
57
|
+
private dependencies;
|
|
58
|
+
/** Map of node → nodes that depend on it */
|
|
59
|
+
private dependents;
|
|
60
|
+
private options;
|
|
61
|
+
constructor(options?: DependencyGraphOptions);
|
|
62
|
+
/**
|
|
63
|
+
* Add a node to the graph
|
|
64
|
+
*/
|
|
65
|
+
addNode(id: NodeId): void;
|
|
66
|
+
/**
|
|
67
|
+
* Add a dependency edge (from depends on to)
|
|
68
|
+
*
|
|
69
|
+
* @param from - Dependent node
|
|
70
|
+
* @param to - Dependency node
|
|
71
|
+
* @returns true if edge was added, false if it would create a cycle
|
|
72
|
+
*/
|
|
73
|
+
addDependency(from: NodeId, to: NodeId): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Remove a node and all its dependencies
|
|
76
|
+
*/
|
|
77
|
+
removeNode(id: NodeId): boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Remove a specific dependency
|
|
80
|
+
*/
|
|
81
|
+
removeDependency(from: NodeId, to: NodeId): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Check if a node exists
|
|
84
|
+
*/
|
|
85
|
+
hasNode(id: NodeId): boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Check if a dependency exists
|
|
88
|
+
*/
|
|
89
|
+
hasDependency(from: NodeId, to: NodeId): boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Get direct dependencies of a node (what it depends on)
|
|
92
|
+
*/
|
|
93
|
+
getDependencies(id: NodeId): NodeId[];
|
|
94
|
+
/**
|
|
95
|
+
* Get direct dependents of a node (what depends on it)
|
|
96
|
+
*/
|
|
97
|
+
getDependents(id: NodeId): NodeId[];
|
|
98
|
+
/**
|
|
99
|
+
* Get all transitive dependencies (recursive)
|
|
100
|
+
*/
|
|
101
|
+
getTransitiveDependencies(id: NodeId): NodeId[];
|
|
102
|
+
/**
|
|
103
|
+
* Get all transitive dependents (recursive)
|
|
104
|
+
*/
|
|
105
|
+
getTransitiveDependents(id: NodeId): NodeId[];
|
|
106
|
+
/**
|
|
107
|
+
* Check if adding a dependency would create a cycle
|
|
108
|
+
*
|
|
109
|
+
* Uses DFS to detect if there's a path from 'to' back to 'from'
|
|
110
|
+
*/
|
|
111
|
+
wouldCreateCycle(from: NodeId, to: NodeId): boolean;
|
|
112
|
+
/**
|
|
113
|
+
* Detect all cycles in the graph using DFS
|
|
114
|
+
*/
|
|
115
|
+
detectCycles(): NodeId[][];
|
|
116
|
+
/**
|
|
117
|
+
* Perform topological sort using Kahn's algorithm
|
|
118
|
+
*
|
|
119
|
+
* Returns nodes in dependency order (dependencies before dependents)
|
|
120
|
+
*/
|
|
121
|
+
topologicalSort(): TopologicalSortResult;
|
|
122
|
+
/**
|
|
123
|
+
* Get calculation order for incremental updates
|
|
124
|
+
*
|
|
125
|
+
* Returns all nodes that need to be recalculated when the given nodes change,
|
|
126
|
+
* in the correct calculation order.
|
|
127
|
+
*/
|
|
128
|
+
getCalculationOrder(changedNodes: NodeId[]): NodeId[];
|
|
129
|
+
/**
|
|
130
|
+
* Clear all nodes and edges
|
|
131
|
+
*/
|
|
132
|
+
clear(): void;
|
|
133
|
+
/**
|
|
134
|
+
* Get all nodes
|
|
135
|
+
*/
|
|
136
|
+
getAllNodes(): NodeId[];
|
|
137
|
+
/**
|
|
138
|
+
* Get statistics about the graph
|
|
139
|
+
*/
|
|
140
|
+
getStats(): GraphStats;
|
|
141
|
+
/**
|
|
142
|
+
* Clone the graph
|
|
143
|
+
*/
|
|
144
|
+
clone(): IDependencyGraph;
|
|
145
|
+
private calculateDepth;
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=dependency-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-graph.d.ts","sourceRoot":"","sources":["../../../../../../packages/shared/src/data-structures/dependency-graph/dependency-graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,MAAM,EACN,sBAAsB,EACtB,qBAAqB,EACrB,UAAU,EACX,MAAM,8BAA8B,CAAC;AAEtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AACH,qBAAa,eAAgB,YAAW,gBAAgB;IACtD,wCAAwC;IACxC,OAAO,CAAC,YAAY,CAAuC;IAE3D,4CAA4C;IAC5C,OAAO,CAAC,UAAU,CAAuC;IAEzD,OAAO,CAAC,OAAO,CAAmC;gBAEtC,OAAO,GAAE,sBAA2B;IAOhD;;OAEG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAOzB;;;;;;OAMG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO;IA4BhD;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAsB/B;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO;IASnD;;OAEG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI5B;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO;IAIhD;;OAEG;IACH,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE;IAIrC;;OAEG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE;IAInC;;OAEG;IACH,yBAAyB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE;IAqB/C;;OAEG;IACH,uBAAuB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE;IAqB7C;;;;OAIG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO;IA0BnD;;OAEG;IACH,YAAY,IAAI,MAAM,EAAE,EAAE;IAsC1B;;;;OAIG;IACH,eAAe,IAAI,qBAAqB;IAuDxC;;;;;OAKG;IACH,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAmCrD;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,WAAW,IAAI,MAAM,EAAE;IAIvB;;OAEG;IACH,QAAQ,IAAI,UAAU;IA+BtB;;OAEG;IACH,KAAK,IAAI,gBAAgB;IAoBzB,OAAO,CAAC,cAAc;CAoBvB"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Graph (DAG) Interface
|
|
3
|
+
*
|
|
4
|
+
* Used for:
|
|
5
|
+
* - Formula dependency tracking (cell A1 depends on B1, C1)
|
|
6
|
+
* - Topological sorting for calculation order
|
|
7
|
+
* - Cycle detection to prevent circular references
|
|
8
|
+
* - Dirty cell tracking for incremental recalculation
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Graph node identifier
|
|
12
|
+
*/
|
|
13
|
+
export type NodeId = string | number;
|
|
14
|
+
/**
|
|
15
|
+
* Dependency relationship
|
|
16
|
+
*/
|
|
17
|
+
export interface Dependency {
|
|
18
|
+
/**
|
|
19
|
+
* Source node (dependent)
|
|
20
|
+
*/
|
|
21
|
+
from: NodeId;
|
|
22
|
+
/**
|
|
23
|
+
* Target node (dependency)
|
|
24
|
+
*/
|
|
25
|
+
to: NodeId;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Topological sort result
|
|
29
|
+
*/
|
|
30
|
+
export interface TopologicalSortResult {
|
|
31
|
+
/**
|
|
32
|
+
* Sorted nodes in dependency order
|
|
33
|
+
*/
|
|
34
|
+
order: NodeId[];
|
|
35
|
+
/**
|
|
36
|
+
* Whether the graph has cycles
|
|
37
|
+
*/
|
|
38
|
+
hasCycle: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Nodes involved in cycles (if any)
|
|
41
|
+
*/
|
|
42
|
+
cycleNodes: NodeId[];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Graph statistics
|
|
46
|
+
*/
|
|
47
|
+
export interface GraphStats {
|
|
48
|
+
/**
|
|
49
|
+
* Total number of nodes
|
|
50
|
+
*/
|
|
51
|
+
nodeCount: number;
|
|
52
|
+
/**
|
|
53
|
+
* Total number of edges (dependencies)
|
|
54
|
+
*/
|
|
55
|
+
edgeCount: number;
|
|
56
|
+
/**
|
|
57
|
+
* Nodes with no dependencies (sources)
|
|
58
|
+
*/
|
|
59
|
+
sourceCount: number;
|
|
60
|
+
/**
|
|
61
|
+
* Nodes with no dependents (sinks)
|
|
62
|
+
*/
|
|
63
|
+
sinkCount: number;
|
|
64
|
+
/**
|
|
65
|
+
* Maximum dependency chain length
|
|
66
|
+
*/
|
|
67
|
+
maxDepth: number;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Dependency Graph options
|
|
71
|
+
*/
|
|
72
|
+
export interface DependencyGraphOptions {
|
|
73
|
+
/**
|
|
74
|
+
* Allow self-loops (node depending on itself)
|
|
75
|
+
* @default false
|
|
76
|
+
*/
|
|
77
|
+
allowSelfLoops?: boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Throw error on cycle detection
|
|
80
|
+
* @default false
|
|
81
|
+
*/
|
|
82
|
+
throwOnCycle?: boolean;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Dependency Graph interface
|
|
86
|
+
*/
|
|
87
|
+
export interface IDependencyGraph {
|
|
88
|
+
/**
|
|
89
|
+
* Add a node to the graph
|
|
90
|
+
*/
|
|
91
|
+
addNode(id: NodeId): void;
|
|
92
|
+
/**
|
|
93
|
+
* Add a dependency edge (from depends on to)
|
|
94
|
+
*/
|
|
95
|
+
addDependency(from: NodeId, to: NodeId): boolean;
|
|
96
|
+
/**
|
|
97
|
+
* Remove a node and all its dependencies
|
|
98
|
+
*/
|
|
99
|
+
removeNode(id: NodeId): boolean;
|
|
100
|
+
/**
|
|
101
|
+
* Remove a specific dependency
|
|
102
|
+
*/
|
|
103
|
+
removeDependency(from: NodeId, to: NodeId): boolean;
|
|
104
|
+
/**
|
|
105
|
+
* Check if a node exists
|
|
106
|
+
*/
|
|
107
|
+
hasNode(id: NodeId): boolean;
|
|
108
|
+
/**
|
|
109
|
+
* Check if a dependency exists
|
|
110
|
+
*/
|
|
111
|
+
hasDependency(from: NodeId, to: NodeId): boolean;
|
|
112
|
+
/**
|
|
113
|
+
* Get all dependencies of a node (what it depends on)
|
|
114
|
+
*/
|
|
115
|
+
getDependencies(id: NodeId): NodeId[];
|
|
116
|
+
/**
|
|
117
|
+
* Get all dependents of a node (what depends on it)
|
|
118
|
+
*/
|
|
119
|
+
getDependents(id: NodeId): NodeId[];
|
|
120
|
+
/**
|
|
121
|
+
* Get all transitive dependencies (recursive)
|
|
122
|
+
*/
|
|
123
|
+
getTransitiveDependencies(id: NodeId): NodeId[];
|
|
124
|
+
/**
|
|
125
|
+
* Get all transitive dependents (recursive)
|
|
126
|
+
*/
|
|
127
|
+
getTransitiveDependents(id: NodeId): NodeId[];
|
|
128
|
+
/**
|
|
129
|
+
* Detect if adding a dependency would create a cycle
|
|
130
|
+
*/
|
|
131
|
+
wouldCreateCycle(from: NodeId, to: NodeId): boolean;
|
|
132
|
+
/**
|
|
133
|
+
* Detect all cycles in the graph
|
|
134
|
+
*/
|
|
135
|
+
detectCycles(): NodeId[][];
|
|
136
|
+
/**
|
|
137
|
+
* Perform topological sort
|
|
138
|
+
*/
|
|
139
|
+
topologicalSort(): TopologicalSortResult;
|
|
140
|
+
/**
|
|
141
|
+
* Get calculation order for incremental updates
|
|
142
|
+
*/
|
|
143
|
+
getCalculationOrder(changedNodes: NodeId[]): NodeId[];
|
|
144
|
+
/**
|
|
145
|
+
* Clear all nodes and edges
|
|
146
|
+
*/
|
|
147
|
+
clear(): void;
|
|
148
|
+
/**
|
|
149
|
+
* Get all nodes
|
|
150
|
+
*/
|
|
151
|
+
getAllNodes(): NodeId[];
|
|
152
|
+
/**
|
|
153
|
+
* Get statistics about the graph
|
|
154
|
+
*/
|
|
155
|
+
getStats(): GraphStats;
|
|
156
|
+
/**
|
|
157
|
+
* Clone the graph
|
|
158
|
+
*/
|
|
159
|
+
clone(): IDependencyGraph;
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=dependency-graph.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-graph.interface.d.ts","sourceRoot":"","sources":["../../../../../../packages/shared/src/data-structures/dependency-graph/dependency-graph.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAErC;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,KAAK,EAAE,MAAM,EAAE,CAAC;IAEhB;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1B;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAEjD;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAEhC;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAEpD;;OAEG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAE7B;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAEjD;;OAEG;IACH,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAEtC;;OAEG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAEpC;;OAEG;IACH,yBAAyB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAEhD;;OAEG;IACH,uBAAuB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAE9C;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAEpD;;OAEG;IACH,YAAY,IAAI,MAAM,EAAE,EAAE,CAAC;IAE3B;;OAEG;IACH,eAAe,IAAI,qBAAqB,CAAC;IAEzC;;OAEG;IACH,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;IAEtD;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;IAEd;;OAEG;IACH,WAAW,IAAI,MAAM,EAAE,CAAC;IAExB;;OAEG;IACH,QAAQ,IAAI,UAAU,CAAC;IAEvB;;OAEG;IACH,KAAK,IAAI,gBAAgB,CAAC;CAC3B"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Graph (DAG) data structure
|
|
3
|
+
*
|
|
4
|
+
* Used for formula dependency tracking, cycle detection, and calculation ordering.
|
|
5
|
+
*/
|
|
6
|
+
export { DependencyGraph } from './dependency-graph';
|
|
7
|
+
export type { IDependencyGraph, NodeId, Dependency, DependencyGraphOptions, TopologicalSortResult, GraphStats, } from './dependency-graph.interface';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../packages/shared/src/data-structures/dependency-graph/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,YAAY,EACV,gBAAgB,EAChB,MAAM,EACN,UAAU,EACV,sBAAsB,EACtB,qBAAqB,EACrB,UAAU,GACX,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Disjoint Set (Union-Find) implementation for ZenGrid
|
|
3
|
+
*/
|
|
4
|
+
import type { IDisjointSet, DisjointSetOptions, DisjointSetStats } from './disjoint-set.interface';
|
|
5
|
+
/**
|
|
6
|
+
* Disjoint Set implementation with path compression and union by rank
|
|
7
|
+
*/
|
|
8
|
+
export declare class DisjointSet<T> implements IDisjointSet<T> {
|
|
9
|
+
private parent;
|
|
10
|
+
private rank;
|
|
11
|
+
private setSize;
|
|
12
|
+
private elementMap;
|
|
13
|
+
private hashFn;
|
|
14
|
+
private equalityFn;
|
|
15
|
+
constructor(options?: DisjointSetOptions<T>);
|
|
16
|
+
/**
|
|
17
|
+
* Create a new set containing only the given element
|
|
18
|
+
*/
|
|
19
|
+
makeSet(element: T): void;
|
|
20
|
+
/**
|
|
21
|
+
* Find the representative (root) of the set containing the element
|
|
22
|
+
* Uses path compression to optimize future queries
|
|
23
|
+
*/
|
|
24
|
+
find(element: T): T | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Internal find with path compression
|
|
27
|
+
*/
|
|
28
|
+
private _findWithCompression;
|
|
29
|
+
/**
|
|
30
|
+
* Unite the sets containing two elements
|
|
31
|
+
* Uses union by rank to keep trees shallow
|
|
32
|
+
*/
|
|
33
|
+
union(element1: T, element2: T): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Check if two elements are in the same set
|
|
36
|
+
*/
|
|
37
|
+
connected(element1: T, element2: T): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Get the size of the set containing the element
|
|
40
|
+
*/
|
|
41
|
+
getSetSize(element: T): number;
|
|
42
|
+
/**
|
|
43
|
+
* Get all disjoint sets
|
|
44
|
+
*/
|
|
45
|
+
getSets(): Map<T, T[]>;
|
|
46
|
+
/**
|
|
47
|
+
* Get all elements in the same set as the given element
|
|
48
|
+
*/
|
|
49
|
+
getSet(element: T): T[];
|
|
50
|
+
/**
|
|
51
|
+
* Check if an element exists in the data structure
|
|
52
|
+
*/
|
|
53
|
+
has(element: T): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Remove an element from the data structure
|
|
56
|
+
* Note: This is not a standard operation and has O(n) complexity
|
|
57
|
+
*/
|
|
58
|
+
remove(element: T): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Clear all sets
|
|
61
|
+
*/
|
|
62
|
+
clear(): void;
|
|
63
|
+
/**
|
|
64
|
+
* Get all elements
|
|
65
|
+
*/
|
|
66
|
+
elements(): T[];
|
|
67
|
+
/**
|
|
68
|
+
* Get statistics about the disjoint set
|
|
69
|
+
*/
|
|
70
|
+
getStats(): DisjointSetStats;
|
|
71
|
+
/**
|
|
72
|
+
* Number of elements in the data structure
|
|
73
|
+
*/
|
|
74
|
+
get size(): number;
|
|
75
|
+
/**
|
|
76
|
+
* Number of disjoint sets
|
|
77
|
+
*/
|
|
78
|
+
get numSets(): number;
|
|
79
|
+
/**
|
|
80
|
+
* Whether the data structure is empty
|
|
81
|
+
*/
|
|
82
|
+
get isEmpty(): boolean;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=disjoint-set.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disjoint-set.d.ts","sourceRoot":"","sources":["../../../../../../packages/shared/src/data-structures/disjoint-set/disjoint-set.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAmBlC;;GAEG;AACH,qBAAa,WAAW,CAAC,CAAC,CAAE,YAAW,YAAY,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,IAAI,CAA+B;IAC3C,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,UAAU,CAA0B;gBAEhC,OAAO,GAAE,kBAAkB,CAAC,CAAC,CAAM;IAgB/C;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI;IAYzB;;;OAGG;IACH,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAS/B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAe5B;;;OAGG;IACH,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,OAAO;IAyCxC;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,OAAO;IAW5C;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,CAAC,GAAG,MAAM;IAU9B;;OAEG;IACH,OAAO,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAetB;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE;IAgBvB;;OAEG;IACH,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO;IAKxB;;;OAGG;IACH,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO;IAkD3B;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,QAAQ,IAAI,CAAC,EAAE;IAIf;;OAEG;IACH,QAAQ,IAAI,gBAAgB;IAgB5B;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,OAAO,CAErB;CACF"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Disjoint Set (Union-Find) interfaces for ZenGrid
|
|
3
|
+
* Efficient data structure for managing merged cells and connected components
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Disjoint Set statistics
|
|
7
|
+
*/
|
|
8
|
+
export interface DisjointSetStats {
|
|
9
|
+
/** Total number of elements */
|
|
10
|
+
totalElements: number;
|
|
11
|
+
/** Number of disjoint sets */
|
|
12
|
+
numSets: number;
|
|
13
|
+
/** Size of the largest set */
|
|
14
|
+
largestSetSize: number;
|
|
15
|
+
/** Average set size */
|
|
16
|
+
averageSetSize: number;
|
|
17
|
+
/** Memory usage estimate in bytes */
|
|
18
|
+
memoryBytes: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Disjoint Set interface (Union-Find)
|
|
22
|
+
*
|
|
23
|
+
* A data structure for tracking a partition of elements into disjoint sets.
|
|
24
|
+
* Uses path compression and union by rank for near-constant time operations.
|
|
25
|
+
*
|
|
26
|
+
* Use cases:
|
|
27
|
+
* - Managing merged cells in spreadsheets
|
|
28
|
+
* - Tracking connected components in graphs
|
|
29
|
+
* - Detecting cycles in undirected graphs
|
|
30
|
+
* - Kruskal's minimum spanning tree algorithm
|
|
31
|
+
* - Image segmentation
|
|
32
|
+
* - Network connectivity
|
|
33
|
+
*
|
|
34
|
+
* Performance:
|
|
35
|
+
* - makeSet: O(1)
|
|
36
|
+
* - find: O(α(n)) amortized, where α is inverse Ackermann function (effectively O(1))
|
|
37
|
+
* - union: O(α(n)) amortized
|
|
38
|
+
* - connected: O(α(n)) amortized
|
|
39
|
+
* - Space: O(n)
|
|
40
|
+
*
|
|
41
|
+
* Optimizations:
|
|
42
|
+
* - Path compression: Makes find operations extremely fast
|
|
43
|
+
* - Union by rank: Keeps trees shallow for better performance
|
|
44
|
+
* - Both optimizations together give near-constant time complexity
|
|
45
|
+
*/
|
|
46
|
+
export interface IDisjointSet<T> {
|
|
47
|
+
/**
|
|
48
|
+
* Create a new set containing only the given element
|
|
49
|
+
* If element already exists, this is a no-op
|
|
50
|
+
* @param element - The element to create a set for
|
|
51
|
+
* @complexity O(1)
|
|
52
|
+
*/
|
|
53
|
+
makeSet(element: T): void;
|
|
54
|
+
/**
|
|
55
|
+
* Find the representative (root) of the set containing the element
|
|
56
|
+
* Uses path compression to optimize future queries
|
|
57
|
+
* @param element - The element to find
|
|
58
|
+
* @returns The representative element, or undefined if element doesn't exist
|
|
59
|
+
* @complexity O(α(n)) amortized
|
|
60
|
+
*/
|
|
61
|
+
find(element: T): T | undefined;
|
|
62
|
+
/**
|
|
63
|
+
* Unite the sets containing two elements
|
|
64
|
+
* Uses union by rank to keep trees shallow
|
|
65
|
+
* @param element1 - First element
|
|
66
|
+
* @param element2 - Second element
|
|
67
|
+
* @returns true if sets were merged, false if already in same set or element doesn't exist
|
|
68
|
+
* @complexity O(α(n)) amortized
|
|
69
|
+
*/
|
|
70
|
+
union(element1: T, element2: T): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Check if two elements are in the same set
|
|
73
|
+
* @param element1 - First element
|
|
74
|
+
* @param element2 - Second element
|
|
75
|
+
* @returns true if both elements exist and are in the same set
|
|
76
|
+
* @complexity O(α(n)) amortized
|
|
77
|
+
*/
|
|
78
|
+
connected(element1: T, element2: T): boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Get the size of the set containing the element
|
|
81
|
+
* @param element - The element to query
|
|
82
|
+
* @returns Size of the set, or 0 if element doesn't exist
|
|
83
|
+
* @complexity O(α(n)) amortized
|
|
84
|
+
*/
|
|
85
|
+
getSetSize(element: T): number;
|
|
86
|
+
/**
|
|
87
|
+
* Get all disjoint sets
|
|
88
|
+
* @returns Map from representative element to array of all elements in that set
|
|
89
|
+
* @complexity O(n)
|
|
90
|
+
*/
|
|
91
|
+
getSets(): Map<T, T[]>;
|
|
92
|
+
/**
|
|
93
|
+
* Get all elements in the same set as the given element
|
|
94
|
+
* @param element - The element to query
|
|
95
|
+
* @returns Array of all elements in the same set, or empty array if element doesn't exist
|
|
96
|
+
* @complexity O(n) - needs to scan all elements
|
|
97
|
+
*/
|
|
98
|
+
getSet(element: T): T[];
|
|
99
|
+
/**
|
|
100
|
+
* Check if an element exists in the data structure
|
|
101
|
+
* @param element - The element to check
|
|
102
|
+
* @complexity O(1)
|
|
103
|
+
*/
|
|
104
|
+
has(element: T): boolean;
|
|
105
|
+
/**
|
|
106
|
+
* Remove an element from the data structure
|
|
107
|
+
* Note: This is not a standard operation for Disjoint Set and has O(n) complexity
|
|
108
|
+
* @param element - The element to remove
|
|
109
|
+
* @returns true if element was found and removed
|
|
110
|
+
* @complexity O(n)
|
|
111
|
+
*/
|
|
112
|
+
remove(element: T): boolean;
|
|
113
|
+
/**
|
|
114
|
+
* Clear all sets
|
|
115
|
+
* @complexity O(1)
|
|
116
|
+
*/
|
|
117
|
+
clear(): void;
|
|
118
|
+
/**
|
|
119
|
+
* Get all elements
|
|
120
|
+
* @returns Array of all elements
|
|
121
|
+
* @complexity O(n)
|
|
122
|
+
*/
|
|
123
|
+
elements(): T[];
|
|
124
|
+
/**
|
|
125
|
+
* Get statistics about the disjoint set
|
|
126
|
+
*/
|
|
127
|
+
getStats(): DisjointSetStats;
|
|
128
|
+
/**
|
|
129
|
+
* Number of elements in the data structure
|
|
130
|
+
*/
|
|
131
|
+
readonly size: number;
|
|
132
|
+
/**
|
|
133
|
+
* Number of disjoint sets
|
|
134
|
+
*/
|
|
135
|
+
readonly numSets: number;
|
|
136
|
+
/**
|
|
137
|
+
* Whether the data structure is empty
|
|
138
|
+
*/
|
|
139
|
+
readonly isEmpty: boolean;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Options for creating a Disjoint Set
|
|
143
|
+
*/
|
|
144
|
+
export interface DisjointSetOptions<T> {
|
|
145
|
+
/**
|
|
146
|
+
* Custom hash function for elements
|
|
147
|
+
* If not provided, uses JSON.stringify for objects or toString for primitives
|
|
148
|
+
*/
|
|
149
|
+
hashFn?: (element: T) => string | number;
|
|
150
|
+
/**
|
|
151
|
+
* Custom equality function
|
|
152
|
+
* If not provided, uses strict equality (===)
|
|
153
|
+
*/
|
|
154
|
+
equalityFn?: (a: T, b: T) => boolean;
|
|
155
|
+
/**
|
|
156
|
+
* Initial elements to create sets for
|
|
157
|
+
*/
|
|
158
|
+
initialElements?: T[];
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Utility functions for Disjoint Set
|
|
162
|
+
*/
|
|
163
|
+
export declare const DisjointSetUtils: {
|
|
164
|
+
/**
|
|
165
|
+
* Calculate expected memory usage
|
|
166
|
+
* @param n - Number of elements
|
|
167
|
+
* @returns Estimated memory in bytes
|
|
168
|
+
*/
|
|
169
|
+
estimateMemory(n: number): number;
|
|
170
|
+
/**
|
|
171
|
+
* Check if operations are effectively O(1)
|
|
172
|
+
* For practical purposes, α(n) ≤ 4 for any realistic n
|
|
173
|
+
*/
|
|
174
|
+
inverseAckermann(n: number): number;
|
|
175
|
+
/**
|
|
176
|
+
* Create a grid coordinate hash function for merged cells
|
|
177
|
+
* Useful for grid applications where elements are [row, col] coordinates
|
|
178
|
+
*/
|
|
179
|
+
gridHashFn(element: [number, number]): string;
|
|
180
|
+
/**
|
|
181
|
+
* Create equality function for grid coordinates
|
|
182
|
+
*/
|
|
183
|
+
gridEqualityFn(a: [number, number], b: [number, number]): boolean;
|
|
184
|
+
};
|
|
185
|
+
//# sourceMappingURL=disjoint-set.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disjoint-set.interface.d.ts","sourceRoot":"","sources":["../../../../../../packages/shared/src/data-structures/disjoint-set/disjoint-set.interface.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,+BAA+B;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,uBAAuB;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B;;;;;OAKG;IACH,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC;IAE1B;;;;;;OAMG;IACH,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAEhC;;;;;;;OAOG;IACH,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC;IAEzC;;;;;;OAMG;IACH,SAAS,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC;IAE7C;;;;;OAKG;IACH,UAAU,CAAC,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC;IAE/B;;;;OAIG;IACH,OAAO,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAEvB;;;;;OAKG;IACH,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IAExB;;;;OAIG;IACH,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC;IAEzB;;;;;;OAMG;IACH,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC;IAE5B;;;OAGG;IACH,KAAK,IAAI,IAAI,CAAC;IAEd;;;;OAIG;IACH,QAAQ,IAAI,CAAC,EAAE,CAAC;IAEhB;;OAEG;IACH,QAAQ,IAAI,gBAAgB,CAAC;IAE7B;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,MAAM,GAAG,MAAM,CAAC;IAEzC;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC;IAErC;;OAEG;IACH,eAAe,CAAC,EAAE,CAAC,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB;IAC3B;;;;OAIG;sBACe,MAAM,GAAG,MAAM;IAOjC;;;OAGG;wBACiB,MAAM,GAAG,MAAM;IAUnC;;;OAGG;wBACiB,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM;IAI7C;;OAEG;sBACe,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO;CAGlE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Disjoint Set (Union-Find) for ZenGrid
|
|
3
|
+
*/
|
|
4
|
+
export { DisjointSet } from './disjoint-set';
|
|
5
|
+
export type { IDisjointSet, DisjointSetOptions, DisjointSetStats, } from './disjoint-set.interface';
|
|
6
|
+
export { DisjointSetUtils } from './disjoint-set.interface';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../packages/shared/src/data-structures/disjoint-set/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EACV,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC"}
|