articulated 0.2.0 → 0.3.0
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/README.md +18 -1
- package/build/commonjs/id_list.d.ts +56 -20
- package/build/commonjs/id_list.js +207 -107
- package/build/commonjs/id_list.js.map +1 -1
- package/build/commonjs/internal/leaf_map.d.ts +25 -0
- package/build/commonjs/internal/leaf_map.js +56 -0
- package/build/commonjs/internal/leaf_map.js.map +1 -0
- package/build/commonjs/internal/seq_map.d.ts +20 -0
- package/build/commonjs/internal/seq_map.js +42 -0
- package/build/commonjs/internal/seq_map.js.map +1 -0
- package/build/esm/id_list.d.ts +56 -20
- package/build/esm/id_list.js +206 -105
- package/build/esm/id_list.js.map +1 -1
- package/build/esm/internal/leaf_map.d.ts +25 -0
- package/build/esm/internal/leaf_map.js +49 -0
- package/build/esm/internal/leaf_map.js.map +1 -0
- package/build/esm/internal/seq_map.d.ts +20 -0
- package/build/esm/internal/seq_map.js +34 -0
- package/build/esm/internal/seq_map.js.map +1 -0
- package/package.json +11 -5
- package/src/id_list.ts +306 -109
- package/src/internal/leaf_map.ts +59 -0
- package/src/internal/seq_map.ts +50 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import createRBTree, { Tree } from "functional-red-black-tree";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* A persistent map from an InnerNode's seq to its parent's seq
|
|
5
|
+
* (or 0 for the root).
|
|
6
|
+
*
|
|
7
|
+
* Sequence numbers start at 1 and increment each time you call set(nextSeq, ...).
|
|
8
|
+
*/
|
|
9
|
+
export class SeqMap {
|
|
10
|
+
constructor(
|
|
11
|
+
private readonly tree: Tree<number, number>,
|
|
12
|
+
private readonly nextSeq: number
|
|
13
|
+
) {}
|
|
14
|
+
|
|
15
|
+
static new(): SeqMap {
|
|
16
|
+
return new this(
|
|
17
|
+
createRBTree((a, b) => a - b),
|
|
18
|
+
1
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
bumpNextSeq(): SeqMap {
|
|
23
|
+
return new SeqMap(this.tree, this.nextSeq + 1);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
get(seq: number): number {
|
|
27
|
+
return this.tree.get(seq)!;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
set(seq: number, value: number): SeqMap {
|
|
31
|
+
// TODO: Vendor functional-red-black-tree and add our own set method
|
|
32
|
+
// so we can avoid this 2x penalty.
|
|
33
|
+
return new SeqMap(this.tree.remove(seq).insert(seq, value), this.nextSeq);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// delete(seq: number): SeqMap {
|
|
37
|
+
// return new SeqMap(this.tree.remove(seq), this.nextSeq);
|
|
38
|
+
// }
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface MutableSeqMap {
|
|
42
|
+
value: SeqMap;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function getAndBumpNextSeq(seqsMut: MutableSeqMap): number {
|
|
46
|
+
// @ts-expect-error Ignore private
|
|
47
|
+
const nextSeq = seqsMut.value.nextSeq;
|
|
48
|
+
seqsMut.value = seqsMut.value.bumpNextSeq();
|
|
49
|
+
return nextSeq;
|
|
50
|
+
}
|