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.
@@ -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
+ }