heap-typed 2.0.5 → 2.1.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/data-structures/base/iterable-element-base.d.ts +186 -83
- package/dist/data-structures/base/iterable-element-base.js +149 -107
- package/dist/data-structures/base/iterable-entry-base.d.ts +95 -119
- package/dist/data-structures/base/iterable-entry-base.js +59 -116
- package/dist/data-structures/base/linear-base.d.ts +250 -192
- package/dist/data-structures/base/linear-base.js +137 -274
- package/dist/data-structures/binary-tree/avl-tree-counter.d.ts +126 -158
- package/dist/data-structures/binary-tree/avl-tree-counter.js +171 -205
- package/dist/data-structures/binary-tree/avl-tree-multi-map.d.ts +100 -69
- package/dist/data-structures/binary-tree/avl-tree-multi-map.js +135 -87
- package/dist/data-structures/binary-tree/avl-tree.d.ts +138 -149
- package/dist/data-structures/binary-tree/avl-tree.js +208 -195
- package/dist/data-structures/binary-tree/binary-tree.d.ts +476 -632
- package/dist/data-structures/binary-tree/binary-tree.js +602 -873
- package/dist/data-structures/binary-tree/bst.d.ts +258 -306
- package/dist/data-structures/binary-tree/bst.js +505 -481
- package/dist/data-structures/binary-tree/red-black-tree.d.ts +107 -179
- package/dist/data-structures/binary-tree/red-black-tree.js +114 -209
- package/dist/data-structures/binary-tree/tree-counter.d.ts +132 -154
- package/dist/data-structures/binary-tree/tree-counter.js +172 -203
- package/dist/data-structures/binary-tree/tree-multi-map.d.ts +72 -69
- package/dist/data-structures/binary-tree/tree-multi-map.js +105 -85
- package/dist/data-structures/graph/abstract-graph.d.ts +238 -233
- package/dist/data-structures/graph/abstract-graph.js +267 -237
- package/dist/data-structures/graph/directed-graph.d.ts +108 -224
- package/dist/data-structures/graph/directed-graph.js +146 -233
- package/dist/data-structures/graph/map-graph.d.ts +49 -55
- package/dist/data-structures/graph/map-graph.js +56 -59
- package/dist/data-structures/graph/undirected-graph.d.ts +103 -146
- package/dist/data-structures/graph/undirected-graph.js +129 -149
- package/dist/data-structures/hash/hash-map.d.ts +164 -338
- package/dist/data-structures/hash/hash-map.js +270 -457
- package/dist/data-structures/heap/heap.d.ts +214 -289
- package/dist/data-structures/heap/heap.js +340 -349
- package/dist/data-structures/heap/max-heap.d.ts +11 -47
- package/dist/data-structures/heap/max-heap.js +11 -66
- package/dist/data-structures/heap/min-heap.d.ts +12 -47
- package/dist/data-structures/heap/min-heap.js +11 -66
- package/dist/data-structures/linked-list/doubly-linked-list.d.ts +231 -347
- package/dist/data-structures/linked-list/doubly-linked-list.js +368 -494
- package/dist/data-structures/linked-list/singly-linked-list.d.ts +261 -310
- package/dist/data-structures/linked-list/singly-linked-list.js +447 -466
- package/dist/data-structures/linked-list/skip-linked-list.d.ts +0 -107
- package/dist/data-structures/linked-list/skip-linked-list.js +0 -100
- package/dist/data-structures/priority-queue/max-priority-queue.d.ts +12 -56
- package/dist/data-structures/priority-queue/max-priority-queue.js +11 -78
- package/dist/data-structures/priority-queue/min-priority-queue.d.ts +11 -57
- package/dist/data-structures/priority-queue/min-priority-queue.js +10 -79
- package/dist/data-structures/priority-queue/priority-queue.d.ts +2 -61
- package/dist/data-structures/priority-queue/priority-queue.js +8 -83
- package/dist/data-structures/queue/deque.d.ts +227 -254
- package/dist/data-structures/queue/deque.js +309 -348
- package/dist/data-structures/queue/queue.d.ts +180 -201
- package/dist/data-structures/queue/queue.js +265 -248
- package/dist/data-structures/stack/stack.d.ts +124 -102
- package/dist/data-structures/stack/stack.js +181 -125
- package/dist/data-structures/trie/trie.d.ts +164 -165
- package/dist/data-structures/trie/trie.js +189 -172
- package/dist/interfaces/binary-tree.d.ts +56 -6
- package/dist/interfaces/graph.d.ts +16 -0
- package/dist/types/data-structures/base/base.d.ts +1 -1
- package/dist/types/data-structures/graph/abstract-graph.d.ts +4 -0
- package/dist/types/utils/utils.d.ts +1 -0
- package/dist/utils/utils.d.ts +1 -1
- package/dist/utils/utils.js +2 -1
- package/package.json +2 -2
- package/src/data-structures/base/iterable-element-base.ts +238 -115
- package/src/data-structures/base/iterable-entry-base.ts +96 -120
- package/src/data-structures/base/linear-base.ts +271 -277
- package/src/data-structures/binary-tree/avl-tree-counter.ts +196 -217
- package/src/data-structures/binary-tree/avl-tree-multi-map.ts +188 -102
- package/src/data-structures/binary-tree/avl-tree.ts +237 -206
- package/src/data-structures/binary-tree/binary-tree.ts +665 -896
- package/src/data-structures/binary-tree/bst.ts +565 -572
- package/src/data-structures/binary-tree/red-black-tree.ts +157 -223
- package/src/data-structures/binary-tree/tree-counter.ts +195 -219
- package/src/data-structures/binary-tree/tree-multi-map.ts +127 -98
- package/src/data-structures/graph/abstract-graph.ts +339 -264
- package/src/data-structures/graph/directed-graph.ts +146 -236
- package/src/data-structures/graph/map-graph.ts +63 -60
- package/src/data-structures/graph/undirected-graph.ts +129 -152
- package/src/data-structures/hash/hash-map.ts +274 -496
- package/src/data-structures/heap/heap.ts +389 -402
- package/src/data-structures/heap/max-heap.ts +12 -76
- package/src/data-structures/heap/min-heap.ts +13 -76
- package/src/data-structures/linked-list/doubly-linked-list.ts +426 -530
- package/src/data-structures/linked-list/singly-linked-list.ts +495 -517
- package/src/data-structures/linked-list/skip-linked-list.ts +1 -108
- package/src/data-structures/priority-queue/max-priority-queue.ts +12 -87
- package/src/data-structures/priority-queue/min-priority-queue.ts +11 -88
- package/src/data-structures/priority-queue/priority-queue.ts +3 -92
- package/src/data-structures/queue/deque.ts +381 -357
- package/src/data-structures/queue/queue.ts +310 -264
- package/src/data-structures/stack/stack.ts +217 -131
- package/src/data-structures/trie/trie.ts +240 -175
- package/src/interfaces/binary-tree.ts +240 -6
- package/src/interfaces/graph.ts +37 -0
- package/src/types/data-structures/base/base.ts +5 -5
- package/src/types/data-structures/graph/abstract-graph.ts +5 -0
- package/src/types/utils/utils.ts +2 -0
- package/src/utils/utils.ts +9 -14
|
@@ -1,16 +1,250 @@
|
|
|
1
1
|
import { BinaryTreeNode } from '../data-structures';
|
|
2
|
-
import type {
|
|
2
|
+
import type {
|
|
3
|
+
BinaryTreeDeleteResult,
|
|
4
|
+
BinaryTreeOptions,
|
|
5
|
+
BTNRep,
|
|
6
|
+
DFSOrderPattern,
|
|
7
|
+
EntryCallback,
|
|
8
|
+
IterationType,
|
|
9
|
+
NodeCallback,
|
|
10
|
+
NodePredicate,
|
|
11
|
+
OptNodeOrNull,
|
|
12
|
+
ReduceEntryCallback,
|
|
13
|
+
ToEntryFn
|
|
14
|
+
} from '../types';
|
|
3
15
|
|
|
4
|
-
|
|
5
|
-
|
|
16
|
+
/**
|
|
17
|
+
* Public, implementation-agnostic binary tree API.
|
|
18
|
+
* K = key, V = value, R = raw/record used with toEntryFn (optional).
|
|
19
|
+
* Transforming methods like `map` use method-level generics MK/MV/MR.
|
|
20
|
+
*/
|
|
21
|
+
export interface IBinaryTree<K = any, V = any, R = any> {
|
|
22
|
+
// ---- state ----
|
|
23
|
+
readonly size: number;
|
|
24
|
+
readonly root: BinaryTreeNode<K, V> | null | undefined;
|
|
25
|
+
readonly isMapMode: boolean;
|
|
26
|
+
// NOTE: iterationType is mutable on the class; remove readonly here to match
|
|
27
|
+
iterationType: IterationType;
|
|
28
|
+
// Extra public state/getters implemented by BinaryTree (useful to callers)
|
|
29
|
+
readonly NIL: BinaryTreeNode<K, V>;
|
|
30
|
+
readonly store: Map<K, V | undefined>;
|
|
31
|
+
readonly toEntryFn?: ToEntryFn<K, V, R>;
|
|
32
|
+
readonly isDuplicate: boolean;
|
|
6
33
|
|
|
7
|
-
|
|
34
|
+
// ---- construction / mutation ----
|
|
35
|
+
_createNode(key: K, value?: BinaryTreeNode<K, V>['value']): BinaryTreeNode<K, V>;
|
|
36
|
+
|
|
37
|
+
createTree(options?: Partial<BinaryTreeOptions<K, V, R>>): IBinaryTree<K, V, R>;
|
|
8
38
|
|
|
9
39
|
add(keyOrNodeOrEntryOrRawElement: BTNRep<K, V, BinaryTreeNode<K, V>>, value?: V, count?: number): boolean;
|
|
10
40
|
|
|
11
|
-
|
|
41
|
+
// Accept raw R as well (when toEntryFn is configured)
|
|
42
|
+
addMany(
|
|
43
|
+
keysNodesEntriesOrRaws: Iterable<
|
|
44
|
+
K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined | R
|
|
45
|
+
>,
|
|
46
|
+
values?: Iterable<V | undefined>
|
|
47
|
+
): boolean[];
|
|
12
48
|
|
|
49
|
+
// Accept BTNRep, predicate, or raw R for deletion
|
|
13
50
|
delete(
|
|
14
|
-
|
|
51
|
+
keyNodeEntryRawOrPredicate: R | BTNRep<K, V, BinaryTreeNode<K, V>> | NodePredicate<BinaryTreeNode<K, V> | null>
|
|
15
52
|
): BinaryTreeDeleteResult<BinaryTreeNode<K, V>>[];
|
|
53
|
+
|
|
54
|
+
clear(): void;
|
|
55
|
+
|
|
56
|
+
isEmpty(): boolean;
|
|
57
|
+
|
|
58
|
+
// ---- query / read ----
|
|
59
|
+
|
|
60
|
+
// Widen `get` to support entry and optional traversal context (matches impl)
|
|
61
|
+
get(
|
|
62
|
+
keyNodeEntryOrPredicate: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,
|
|
63
|
+
startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,
|
|
64
|
+
iterationType?: IterationType
|
|
65
|
+
): V | undefined;
|
|
66
|
+
|
|
67
|
+
// `has` also supports node/entry/predicate and optional traversal context
|
|
68
|
+
has(
|
|
69
|
+
keyNodeEntryOrPredicate?:
|
|
70
|
+
| K
|
|
71
|
+
| BinaryTreeNode<K, V>
|
|
72
|
+
| [K | null | undefined, V | undefined]
|
|
73
|
+
| null
|
|
74
|
+
| undefined
|
|
75
|
+
| NodePredicate<BinaryTreeNode<K, V> | null>,
|
|
76
|
+
startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,
|
|
77
|
+
iterationType?: IterationType
|
|
78
|
+
): boolean;
|
|
79
|
+
|
|
80
|
+
hasValue(value: V): boolean;
|
|
81
|
+
|
|
82
|
+
find(predicate: EntryCallback<K, V | undefined, boolean>, thisArg?: unknown): [K, V | undefined] | undefined;
|
|
83
|
+
|
|
84
|
+
// ---- iteration ----
|
|
85
|
+
[Symbol.iterator](): IterableIterator<[K, V | undefined]>;
|
|
86
|
+
|
|
87
|
+
entries(): IterableIterator<[K, V | undefined]>;
|
|
88
|
+
|
|
89
|
+
keys(): IterableIterator<K>;
|
|
90
|
+
|
|
91
|
+
values(): IterableIterator<V | undefined>;
|
|
92
|
+
|
|
93
|
+
forEach(callbackfn: EntryCallback<K, V | undefined, void>, thisArg?: unknown): void;
|
|
94
|
+
|
|
95
|
+
every(callbackfn: EntryCallback<K, V | undefined, boolean>, thisArg?: unknown): boolean;
|
|
96
|
+
|
|
97
|
+
some(callbackfn: EntryCallback<K, V | undefined, boolean>, thisArg?: unknown): boolean;
|
|
98
|
+
|
|
99
|
+
reduce<U>(reducer: ReduceEntryCallback<K, V | undefined, U>, initialValue: U): U;
|
|
100
|
+
|
|
101
|
+
// ---- node access / extremes ----
|
|
102
|
+
getNode(
|
|
103
|
+
keyNodeEntryOrPredicate:
|
|
104
|
+
| K
|
|
105
|
+
| BinaryTreeNode<K, V>
|
|
106
|
+
| [K | null | undefined, V | undefined]
|
|
107
|
+
| null
|
|
108
|
+
| undefined
|
|
109
|
+
| NodePredicate<BinaryTreeNode<K, V> | null>,
|
|
110
|
+
startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,
|
|
111
|
+
iterationType?: IterationType
|
|
112
|
+
): OptNodeOrNull<BinaryTreeNode<K, V>>;
|
|
113
|
+
|
|
114
|
+
getLeftMost<C extends NodeCallback<OptNodeOrNull<BinaryTreeNode<K, V>>>>(
|
|
115
|
+
callback?: C,
|
|
116
|
+
startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,
|
|
117
|
+
iterationType?: IterationType
|
|
118
|
+
): ReturnType<C>;
|
|
119
|
+
|
|
120
|
+
getRightMost<C extends NodeCallback<BinaryTreeNode<K, V> | undefined>>(
|
|
121
|
+
callback?: C,
|
|
122
|
+
startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,
|
|
123
|
+
iterationType?: IterationType
|
|
124
|
+
): ReturnType<C>;
|
|
125
|
+
|
|
126
|
+
// ---- traversal ----
|
|
127
|
+
dfs<C extends NodeCallback<BinaryTreeNode<K, V>>>(
|
|
128
|
+
callback?: C,
|
|
129
|
+
pattern?: DFSOrderPattern,
|
|
130
|
+
onlyOne?: boolean,
|
|
131
|
+
startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,
|
|
132
|
+
iterationType?: IterationType
|
|
133
|
+
): ReturnType<C>[];
|
|
134
|
+
|
|
135
|
+
dfs<C extends NodeCallback<BinaryTreeNode<K, V> | null>>(
|
|
136
|
+
callback?: C,
|
|
137
|
+
pattern?: DFSOrderPattern,
|
|
138
|
+
onlyOne?: boolean,
|
|
139
|
+
startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,
|
|
140
|
+
iterationType?: IterationType,
|
|
141
|
+
includeNull?: boolean
|
|
142
|
+
): ReturnType<C>[];
|
|
143
|
+
|
|
144
|
+
bfs<C extends NodeCallback<BinaryTreeNode<K, V>>>(
|
|
145
|
+
callback?: C,
|
|
146
|
+
startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,
|
|
147
|
+
iterationType?: IterationType,
|
|
148
|
+
includeNull?: false
|
|
149
|
+
): ReturnType<C>[];
|
|
150
|
+
|
|
151
|
+
bfs<C extends NodeCallback<BinaryTreeNode<K, V> | null>>(
|
|
152
|
+
callback?: C,
|
|
153
|
+
startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,
|
|
154
|
+
iterationType?: IterationType,
|
|
155
|
+
includeNull?: true
|
|
156
|
+
): ReturnType<C>[];
|
|
157
|
+
|
|
158
|
+
morris<C extends NodeCallback<BinaryTreeNode<K, V> | null>>(
|
|
159
|
+
callback?: C,
|
|
160
|
+
pattern?: DFSOrderPattern,
|
|
161
|
+
startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined
|
|
162
|
+
): ReturnType<C>[];
|
|
163
|
+
|
|
164
|
+
leaves<C extends NodeCallback<BinaryTreeNode<K, V> | null>>(
|
|
165
|
+
callback?: C,
|
|
166
|
+
startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,
|
|
167
|
+
iterationType?: IterationType
|
|
168
|
+
): ReturnType<C>[];
|
|
169
|
+
|
|
170
|
+
listLevels<C extends NodeCallback<BinaryTreeNode<K, V>>>(
|
|
171
|
+
callback?: C,
|
|
172
|
+
startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,
|
|
173
|
+
iterationType?: IterationType,
|
|
174
|
+
includeNull?: false
|
|
175
|
+
): ReturnType<C>[][];
|
|
176
|
+
|
|
177
|
+
listLevels<C extends NodeCallback<BinaryTreeNode<K, V> | null>>(
|
|
178
|
+
callback?: C,
|
|
179
|
+
startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,
|
|
180
|
+
iterationType?: IterationType,
|
|
181
|
+
includeNull?: true
|
|
182
|
+
): ReturnType<C>[][];
|
|
183
|
+
|
|
184
|
+
getPathToRoot<C extends NodeCallback<OptNodeOrNull<BinaryTreeNode<K, V>>>>(
|
|
185
|
+
beginNode: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,
|
|
186
|
+
callback?: C,
|
|
187
|
+
isReverse?: boolean
|
|
188
|
+
): ReturnType<C>[];
|
|
189
|
+
|
|
190
|
+
// ---- metrics & validation ----
|
|
191
|
+
getDepth(
|
|
192
|
+
dist: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,
|
|
193
|
+
startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined
|
|
194
|
+
): number;
|
|
195
|
+
|
|
196
|
+
getHeight(
|
|
197
|
+
startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,
|
|
198
|
+
iterationType?: IterationType
|
|
199
|
+
): number;
|
|
200
|
+
|
|
201
|
+
getMinHeight(
|
|
202
|
+
startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,
|
|
203
|
+
iterationType?: IterationType
|
|
204
|
+
): number;
|
|
205
|
+
|
|
206
|
+
isPerfectlyBalanced(
|
|
207
|
+
startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined
|
|
208
|
+
): boolean;
|
|
209
|
+
|
|
210
|
+
isBST(
|
|
211
|
+
startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,
|
|
212
|
+
iterationType?: IterationType
|
|
213
|
+
): boolean;
|
|
214
|
+
|
|
215
|
+
// ---- search helpers ----
|
|
216
|
+
search<C extends NodeCallback<BinaryTreeNode<K, V> | null>>(
|
|
217
|
+
keyNodeEntryOrPredicate:
|
|
218
|
+
| K
|
|
219
|
+
| BinaryTreeNode<K, V>
|
|
220
|
+
| [K | null | undefined, V | undefined]
|
|
221
|
+
| null
|
|
222
|
+
| undefined
|
|
223
|
+
| NodePredicate<BinaryTreeNode<K, V> | null>,
|
|
224
|
+
onlyOne?: boolean,
|
|
225
|
+
callback?: C,
|
|
226
|
+
startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,
|
|
227
|
+
iterationType?: IterationType
|
|
228
|
+
): ReturnType<C>[];
|
|
229
|
+
|
|
230
|
+
// ---- immutable transforms ----
|
|
231
|
+
clone(): this;
|
|
232
|
+
|
|
233
|
+
filter(predicate: EntryCallback<K, V | undefined, boolean>, thisArg?: unknown): this;
|
|
234
|
+
|
|
235
|
+
map<MK = K, MV = V, MR = any>(
|
|
236
|
+
callback: EntryCallback<K, V | undefined, [MK, MV]>,
|
|
237
|
+
options?: Partial<BinaryTreeOptions<MK, MV, MR>>,
|
|
238
|
+
thisArg?: unknown
|
|
239
|
+
): IBinaryTree<MK, MV, MR>;
|
|
240
|
+
|
|
241
|
+
// ---- bulk / interop ----
|
|
242
|
+
merge(anotherTree: IBinaryTree<K, V, R>): void;
|
|
243
|
+
|
|
244
|
+
refill(
|
|
245
|
+
keysNodesEntriesOrRaws: Iterable<
|
|
246
|
+
K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined | R
|
|
247
|
+
>,
|
|
248
|
+
values?: Iterable<V | undefined>
|
|
249
|
+
): void;
|
|
16
250
|
}
|
package/src/interfaces/graph.ts
CHANGED
|
@@ -1,7 +1,44 @@
|
|
|
1
1
|
import { VertexKey } from '../types';
|
|
2
2
|
|
|
3
3
|
export interface IGraph<V, E, VO, EO> {
|
|
4
|
+
// Vertex factories
|
|
4
5
|
createVertex(key: VertexKey, value?: V): VO;
|
|
5
6
|
|
|
7
|
+
// Edge factories
|
|
6
8
|
createEdge(srcOrV1: VertexKey, destOrV2: VertexKey, weight?: number, value?: E): EO;
|
|
9
|
+
|
|
10
|
+
// Core vertex ops
|
|
11
|
+
getVertex(vertexKey: VertexKey): VO | undefined;
|
|
12
|
+
|
|
13
|
+
hasVertex(vertexOrKey: VO | VertexKey): boolean;
|
|
14
|
+
|
|
15
|
+
addVertex(vertex: VO): boolean;
|
|
16
|
+
|
|
17
|
+
addVertex(key: VertexKey, value?: V): boolean;
|
|
18
|
+
|
|
19
|
+
deleteVertex(vertexOrKey: VO | VertexKey): boolean;
|
|
20
|
+
|
|
21
|
+
// Core edge ops
|
|
22
|
+
deleteEdge(edge: EO): EO | undefined;
|
|
23
|
+
|
|
24
|
+
getEdge(srcOrKey: VO | VertexKey, destOrKey: VO | VertexKey): EO | undefined;
|
|
25
|
+
|
|
26
|
+
degreeOf(vertexOrKey: VO | VertexKey): number;
|
|
27
|
+
|
|
28
|
+
edgeSet(): EO[];
|
|
29
|
+
|
|
30
|
+
edgesOf(vertexOrKey: VO | VertexKey): EO[];
|
|
31
|
+
|
|
32
|
+
getNeighbors(vertexOrKey: VO | VertexKey): VO[];
|
|
33
|
+
|
|
34
|
+
getEndsOfEdge(edge: EO): [VO, VO] | undefined;
|
|
35
|
+
|
|
36
|
+
// Container-like ops
|
|
37
|
+
isEmpty(): boolean;
|
|
38
|
+
|
|
39
|
+
clear(): void;
|
|
40
|
+
|
|
41
|
+
clone(): this;
|
|
42
|
+
|
|
43
|
+
filter(...args: any[]): this;
|
|
7
44
|
}
|
|
@@ -11,12 +11,12 @@ export type ReduceEntryCallback<K, V, R> = (
|
|
|
11
11
|
original: IterableEntryBase<K, V>
|
|
12
12
|
) => R;
|
|
13
13
|
|
|
14
|
-
export type ReduceElementCallback<E, R,
|
|
15
|
-
accumulator:
|
|
16
|
-
|
|
14
|
+
export type ReduceElementCallback<E, R, U = E> = (
|
|
15
|
+
accumulator: U,
|
|
16
|
+
value: E,
|
|
17
17
|
index: number,
|
|
18
|
-
|
|
19
|
-
) =>
|
|
18
|
+
self: IterableElementBase<E, R>
|
|
19
|
+
) => U;
|
|
20
20
|
|
|
21
21
|
export type ReduceLinearCallback<E, RT = E> = (
|
|
22
22
|
accumulator: RT,
|
package/src/types/utils/utils.ts
CHANGED
|
@@ -4,6 +4,8 @@ export type Any = string | number | bigint | boolean | symbol | undefined | obje
|
|
|
4
4
|
|
|
5
5
|
export type Arithmetic = number | bigint;
|
|
6
6
|
|
|
7
|
+
export type ElemOf<T> = T extends (infer U)[] ? U : never;
|
|
8
|
+
|
|
7
9
|
export type ComparablePrimitive = number | bigint | string | boolean;
|
|
8
10
|
|
|
9
11
|
export interface BaseComparableObject {
|
package/src/utils/utils.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* @copyright Copyright (c) 2022 Pablo Zeng <zrwusa@gmail.com>
|
|
6
6
|
* @license MIT License
|
|
7
7
|
*/
|
|
8
|
-
import type { Comparable, ComparablePrimitive,
|
|
8
|
+
import type { Comparable, ComparablePrimitive, Trampoline, TrampolineThunk } from '../types';
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* The function generates a random UUID (Universally Unique Identifier) in TypeScript.
|
|
@@ -209,9 +209,7 @@ export function isComparable(value: unknown, isForceObjectComparable = false): v
|
|
|
209
209
|
* @param computation - A function that, when executed, returns the next trampoline step.
|
|
210
210
|
* @returns A TrampolineThunk object containing the deferred computation.
|
|
211
211
|
*/
|
|
212
|
-
export const makeTrampolineThunk = <T>(
|
|
213
|
-
computation: () => Trampoline<T>
|
|
214
|
-
): TrampolineThunk<T> => ({
|
|
212
|
+
export const makeTrampolineThunk = <T>(computation: () => Trampoline<T>): TrampolineThunk<T> => ({
|
|
215
213
|
isThunk: true, // Marker indicating this is a thunk
|
|
216
214
|
fn: computation // The deferred computation function
|
|
217
215
|
});
|
|
@@ -226,13 +224,11 @@ export const makeTrampolineThunk = <T>(
|
|
|
226
224
|
* @param value - The value to test.
|
|
227
225
|
* @returns True if the value is a valid TrampolineThunk, false otherwise.
|
|
228
226
|
*/
|
|
229
|
-
export const isTrampolineThunk = <T>(
|
|
230
|
-
value: Trampoline<T>
|
|
231
|
-
): value is TrampolineThunk<T> =>
|
|
227
|
+
export const isTrampolineThunk = <T>(value: Trampoline<T>): value is TrampolineThunk<T> =>
|
|
232
228
|
typeof value === 'object' && // Must be an object
|
|
233
|
-
value !== null &&
|
|
234
|
-
'isThunk' in value &&
|
|
235
|
-
value.isThunk;
|
|
229
|
+
value !== null && // Must not be null
|
|
230
|
+
'isThunk' in value && // Must have the 'isThunk' property
|
|
231
|
+
value.isThunk; // The flag must be true
|
|
236
232
|
|
|
237
233
|
/**
|
|
238
234
|
* Executes a trampoline computation until a final (non-thunk) result is obtained.
|
|
@@ -247,7 +243,8 @@ export const isTrampolineThunk = <T>(
|
|
|
247
243
|
*/
|
|
248
244
|
export function trampoline<T>(initial: Trampoline<T>): T {
|
|
249
245
|
let current = initial; // Start with the initial trampoline value
|
|
250
|
-
while (isTrampolineThunk(current)) {
|
|
246
|
+
while (isTrampolineThunk(current)) {
|
|
247
|
+
// Keep unwrapping while we have thunks
|
|
251
248
|
current = current.fn(); // Execute the deferred function to get the next step
|
|
252
249
|
}
|
|
253
250
|
return current; // Once no thunks remain, return the final result
|
|
@@ -302,9 +299,7 @@ export function makeTrampoline<Args extends any[], Result>(
|
|
|
302
299
|
* @param initial - The initial Trampoline or Promise of Trampoline to start execution from.
|
|
303
300
|
* @returns A Promise that resolves to the final result (a non-thunk value).
|
|
304
301
|
*/
|
|
305
|
-
export async function asyncTrampoline<T>(
|
|
306
|
-
initial: Trampoline<T> | Promise<Trampoline<T>>
|
|
307
|
-
): Promise<T> {
|
|
302
|
+
export async function asyncTrampoline<T>(initial: Trampoline<T> | Promise<Trampoline<T>>): Promise<T> {
|
|
308
303
|
let current = await initial; // Wait for the initial step to resolve if it's a Promise
|
|
309
304
|
|
|
310
305
|
// Keep executing thunks until we reach a non-thunk (final) value
|