@opendaw/lib-box 0.0.13 → 0.0.14

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 CHANGED
@@ -1 +1,39 @@
1
- This package is part of the openDAW SDK
1
+ _This package is part of the openDAW SDK_
2
+
3
+ # @opendaw/lib-box
4
+
5
+ Graph-based object modeling system with serialization, transactions, and pointer management for TypeScript projects.
6
+
7
+ ## Core Architecture
8
+
9
+ * **box.ts** - Core Box class for graph nodes with field management
10
+ * **vertex.ts** - Vertex interface and visitor pattern definitions
11
+ * **graph.ts** - BoxGraph class for managing object relationships
12
+ * **field.ts** - Field abstraction for object properties
13
+ * **address.ts** - Addressing system for graph navigation
14
+
15
+ ## Field Types
16
+
17
+ * **primitive.ts** - Primitive field types (boolean, number, string)
18
+ * **array.ts** - Array field implementations
19
+ * **object.ts** - Object field for nested structures
20
+ * **pointer.ts** - Pointer field for object references
21
+
22
+ ## Graph Management
23
+
24
+ * **graph-edges.ts** - Edge management for graph relationships
25
+ * **pointer-hub.ts** - Hub for managing incoming pointer connections
26
+ * **dispatchers.ts** - Event dispatching system for updates
27
+ * **updates.ts** - Update event definitions and handling
28
+
29
+ ## Serialization & Persistence
30
+
31
+ * **serializer.ts** - Serialization utilities for objects
32
+ * **sync.ts** - Synchronization utilities
33
+ * **sync-source.ts** - Source-side synchronization
34
+ * **sync-target.ts** - Target-side synchronization
35
+
36
+ ## Editing & Transactions
37
+
38
+ * **editing.ts** - Undo/redo system for graph modifications
39
+ * **indexed-box.ts** - Indexed box implementation for efficient lookups
package/dist/box.d.ts CHANGED
@@ -42,7 +42,7 @@ export declare abstract class Box<P extends PointerTypes = PointerTypes, F exten
42
42
  serialize(): ArrayBufferLike;
43
43
  toArrayBuffer(): ArrayBufferLike;
44
44
  incomingEdges(): ReadonlyArray<PointerField>;
45
- outgoingEdges(): ReadonlyArray<[PointerField, Vertex]>;
45
+ outgoingEdges(): ReadonlyArray<[PointerField, Address]>;
46
46
  mapFields<T>(map: Func<Field, T>, ...keys: FieldKey[]): ReadonlyArray<T>;
47
47
  searchVertex(keys: FieldKeys): Option<Vertex>;
48
48
  delete(): void;
package/dist/box.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"box.d.ts","sourceRoot":"","sources":["../src/box.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"box.d.ts","sourceRoot":"","sources":["../src/box.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { Address } from "./address";
1
2
  import { PointerField } from "./pointer";
2
3
  import { Vertex } from "./vertex";
3
4
  import { Box } from "./box";
@@ -6,9 +7,9 @@ export declare class GraphEdges {
6
7
  constructor();
7
8
  watchVertex(vertex: Vertex | PointerField): void;
8
9
  unwatchVerticesOf(...boxes: ReadonlyArray<Box>): void;
9
- connect(source: PointerField, target: Vertex): void;
10
+ connect(source: PointerField, target: Address): void;
10
11
  disconnect(source: PointerField): void;
11
- outgoingEdgesOf(box: Box): ReadonlyArray<[PointerField, Vertex]>;
12
+ outgoingEdgesOf(box: Box): ReadonlyArray<[PointerField, Address]>;
12
13
  incomingEdgesOf(vertex: Box | Vertex): ReadonlyArray<PointerField>;
13
14
  validateRequirements(): void;
14
15
  verifyPointers(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"graph-edges.d.ts","sourceRoot":"","sources":["../src/graph-edges.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,YAAY,EAAC,MAAM,WAAW,CAAA;AACtC,OAAO,EAAC,MAAM,EAAC,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAC,GAAG,EAAC,MAAM,OAAO,CAAA;AAEzB,qBAAa,UAAU;;;IAanB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAchD,iBAAiB,CAAC,GAAG,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,GAAG,IAAI;IAoBrD,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAQnD,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAOtC,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,aAAa,CAAC,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAIhE,eAAe,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,GAAG,aAAa,CAAC,YAAY,CAAC;IASlE,oBAAoB,IAAI,IAAI;IAqB5B,cAAc,IAAI,IAAI;CAczB"}
1
+ {"version":3,"file":"graph-edges.d.ts","sourceRoot":"","sources":["../src/graph-edges.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AACjC,OAAO,EAAC,YAAY,EAAC,MAAM,WAAW,CAAA;AACtC,OAAO,EAAC,MAAM,EAAC,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAC,GAAG,EAAC,MAAM,OAAO,CAAA;AAEzB,qBAAa,UAAU;;;IAanB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAchD,iBAAiB,CAAC,GAAG,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,GAAG,IAAI;IAoBrD,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAQpD,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAOtC,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,aAAa,CAAC,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAIjE,eAAe,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,GAAG,aAAa,CAAC,YAAY,CAAC;IASlE,oBAAoB,IAAI,IAAI;IAqB5B,cAAc,IAAI,IAAI;CAgBzB"}
@@ -9,7 +9,7 @@ export class GraphEdges {
9
9
  constructor() {
10
10
  this.#requiresTarget = Address.newSet(source => source.address);
11
11
  this.#requiresPointer = Address.newSet(vertex => vertex.address);
12
- this.#incoming = Address.newSet(([vertex]) => vertex.address);
12
+ this.#incoming = Address.newSet(([address]) => address);
13
13
  this.#outgoing = Address.newSet(([source]) => source.address);
14
14
  }
15
15
  watchVertex(vertex) {
@@ -45,17 +45,17 @@ export class GraphEdges {
45
45
  }
46
46
  connect(source, target) {
47
47
  this.#outgoing.add([source, target]);
48
- this.#incoming.opt(target.address).match({
48
+ this.#incoming.opt(target).match({
49
49
  none: () => this.#incoming.add([target, [source]]),
50
50
  some: ([, sources]) => sources.push(source)
51
51
  });
52
52
  }
53
53
  disconnect(source) {
54
54
  const [, target] = this.#outgoing.removeByKey(source.address);
55
- const [, sources] = this.#incoming.get(target.address);
55
+ const [, sources] = this.#incoming.get(target);
56
56
  Arrays.remove(sources, source);
57
57
  if (sources.length === 0) {
58
- this.#incoming.removeByKey(target.address);
58
+ this.#incoming.removeByKey(target);
59
59
  }
60
60
  }
61
61
  outgoingEdgesOf(box) {
@@ -63,7 +63,7 @@ export class GraphEdges {
63
63
  }
64
64
  incomingEdgesOf(vertex) {
65
65
  if (vertex.isBox()) {
66
- return this.#collectSameBox(this.#incoming, vertex.address.uuid, ([{ address: { uuid } }]) => uuid)
66
+ return this.#collectSameBox(this.#incoming, vertex.address.uuid, ([{ uuid }]) => uuid)
67
67
  .flatMap(([_, pointers]) => pointers);
68
68
  }
69
69
  else {
@@ -94,7 +94,7 @@ export class GraphEdges {
94
94
  }
95
95
  verifyPointers() {
96
96
  this.#requiresTarget.forEach(pointer => assert(pointer.isAttached(), `${pointer.address.toString()} is not attached`));
97
- this.#requiresPointer.forEach(pointer => assert(pointer.isAttached(), `${pointer.address.toString()} is not attached`));
97
+ this.#requiresPointer.forEach(vertex => assert(vertex.isAttached(), `${vertex.address.toString()} is not attached`));
98
98
  }
99
99
  #collectSameBox(set, id, map) {
100
100
  const range = Address.boxRange(set, id, map);
package/dist/graph.d.ts CHANGED
@@ -26,7 +26,6 @@ export declare class BoxGraph<BoxMap = any> {
26
26
  endTransaction(): void;
27
27
  inTransaction(): boolean;
28
28
  constructingBox(): boolean;
29
- resolvePointers(): void;
30
29
  createBox(name: keyof BoxMap, uuid: UUID.Format, constructor: Procedure<Box>): void;
31
30
  stageBox<B extends Box>(box: B, constructor?: Procedure<B>): B;
32
31
  subscribeTransaction(listener: TransactionListener): Subscription;
@@ -1 +1 @@
1
- {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"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"}
package/dist/graph.js CHANGED
@@ -33,7 +33,10 @@ export class BoxGraph {
33
33
  endTransaction() {
34
34
  assert(this.#inTransaction, "No transaction in progress");
35
35
  this.#inTransaction = false;
36
- this.resolvePointers();
36
+ if (this.#deferredPointerUpdates.length > 0) {
37
+ this.#deferredPointerUpdates.forEach(({ pointerField, update }) => this.#processPointerVertexUpdate(pointerField, update));
38
+ this.#deferredPointerUpdates.length = 0;
39
+ }
37
40
  // it is possible that new observers will be added while executing
38
41
  while (this.#finalizeTransactionObservers.length > 0) {
39
42
  this.#finalizeTransactionObservers.splice(0).forEach(observer => observer());
@@ -45,13 +48,6 @@ export class BoxGraph {
45
48
  }
46
49
  inTransaction() { return this.#inTransaction; }
47
50
  constructingBox() { return this.#constructingBox; }
48
- resolvePointers() {
49
- if (this.#deferredPointerUpdates.length === 0) {
50
- return;
51
- }
52
- this.#deferredPointerUpdates.forEach(({ pointerField, update }) => this.#processPointerValueUpdate(pointerField, update));
53
- this.#deferredPointerUpdates.length = 0;
54
- }
55
51
  createBox(name, uuid, constructor) {
56
52
  this.#boxFactory.unwrap("No box-factory installed")(name, this, uuid, constructor);
57
53
  }
@@ -116,29 +112,29 @@ export class BoxGraph {
116
112
  }
117
113
  onPointerAddressUpdated(pointerField, oldValue, newValue) {
118
114
  this.#assertTransaction();
115
+ if (oldValue.nonEmpty()) {
116
+ this.#edges.disconnect(pointerField);
117
+ }
118
+ if (newValue.nonEmpty()) {
119
+ this.#edges.connect(pointerField, newValue.unwrap());
120
+ }
119
121
  const update = new PointerUpdate(pointerField.address, oldValue, newValue);
120
122
  if (this.#constructingBox) {
121
123
  this.#deferredPointerUpdates.push({ pointerField, update });
122
124
  }
123
125
  else {
124
- this.#processPointerValueUpdate(pointerField, update);
126
+ this.#processPointerVertexUpdate(pointerField, update);
125
127
  this.#immediateUpdateListeners.proxy.onUpdate(update);
126
128
  }
127
129
  }
128
- #processPointerValueUpdate(pointerField, update) {
129
- const { oldValue } = update;
130
- const oldVertex = oldValue.flatMap(address => this.findVertex(address)).unwrapOrNull();
131
- pointerField.resolve();
132
- const newVertex = pointerField.targetVertex.unwrapOrNull();
133
- if (oldVertex !== newVertex) {
134
- oldVertex?.pointerHub.onRemoved(pointerField);
135
- newVertex?.pointerHub.onAdded(pointerField);
136
- if (oldVertex !== null) {
137
- this.#edges.disconnect(pointerField);
138
- }
139
- if (newVertex !== null) {
140
- this.#edges.connect(pointerField, newVertex);
141
- }
130
+ #processPointerVertexUpdate(pointerField, update) {
131
+ const { oldAddress, newAddress } = update;
132
+ const oldVertex = oldAddress.flatMap(address => this.findVertex(address));
133
+ const newVertex = newAddress.flatMap(address => this.findVertex(address));
134
+ pointerField.resolvedTo(newVertex);
135
+ if (!oldVertex.equals(newVertex)) {
136
+ oldVertex.ifSome(vertex => vertex.pointerHub.onRemoved(pointerField));
137
+ newVertex.ifSome(vertex => vertex.pointerHub.onAdded(pointerField));
142
138
  }
143
139
  this.#dispatchers.dispatch(update);
144
140
  this.#updateListeners.proxy.onUpdate(update);
@@ -153,11 +149,13 @@ export class BoxGraph {
153
149
  boxes.add(box);
154
150
  box.outgoingEdges()
155
151
  .filter(([pointer]) => !pointers.has(pointer))
156
- .forEach(([source, target]) => {
152
+ .forEach(([source, targetAddress]) => {
153
+ const targetVertex = this.findVertex(targetAddress)
154
+ .unwrap(`Could not find target of ${source.toString()}`);
157
155
  pointers.add(source);
158
- if (target.pointerRules.mandatory &&
159
- target.pointerHub.incoming().every(pointer => pointers.has(pointer))) {
160
- return trace(target.box);
156
+ if (targetVertex.pointerRules.mandatory &&
157
+ targetVertex.pointerHub.incoming().every(pointer => pointers.has(pointer))) {
158
+ return trace(targetVertex.box);
161
159
  }
162
160
  });
163
161
  box.incomingEdges()
package/dist/index.d.ts CHANGED
@@ -6,6 +6,7 @@ export * from "./editing";
6
6
  export * from "./field";
7
7
  export * from "./graph";
8
8
  export * from "./graph-edges";
9
+ export * from "./indexed-box";
9
10
  export * from "./object";
10
11
  export * from "./pointer";
11
12
  export * from "./pointer-hub";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,cAAc,WAAW,CAAA;AACzB,cAAc,SAAS,CAAA;AACvB,cAAc,OAAO,CAAA;AACrB,cAAc,eAAe,CAAA;AAC7B,cAAc,WAAW,CAAA;AACzB,cAAc,SAAS,CAAA;AACvB,cAAc,SAAS,CAAA;AACvB,cAAc,eAAe,CAAA;AAC7B,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,QAAQ,CAAA;AACtB,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,WAAW,CAAA;AACzB,cAAc,UAAU,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,cAAc,WAAW,CAAA;AACzB,cAAc,SAAS,CAAA;AACvB,cAAc,OAAO,CAAA;AACrB,cAAc,eAAe,CAAA;AAC7B,cAAc,WAAW,CAAA;AACzB,cAAc,SAAS,CAAA;AACvB,cAAc,SAAS,CAAA;AACvB,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,QAAQ,CAAA;AACtB,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,WAAW,CAAA;AACzB,cAAc,UAAU,CAAA"}
package/dist/index.js CHANGED
@@ -14,6 +14,7 @@ export * from "./editing";
14
14
  export * from "./field";
15
15
  export * from "./graph";
16
16
  export * from "./graph-edges";
17
+ export * from "./indexed-box";
17
18
  export * from "./object";
18
19
  export * from "./pointer";
19
20
  export * from "./pointer-hub";
@@ -0,0 +1,15 @@
1
+ import { Field } from "./field";
2
+ import { Class, int } from "@opendaw/lib-std";
3
+ import { Int32Field } from "./primitive";
4
+ import { Box } from "./box";
5
+ /**
6
+ * Utility functions for managing indexed box collections with automatic index adjustment.
7
+ */
8
+ export type IndexedBox = Box & Record<"index", Int32Field>;
9
+ export declare namespace IndexedBox {
10
+ const insertOrder: (field: Field, insertIndex?: int) => int;
11
+ const removeOrder: (field: Field, removeIndex: int) => void;
12
+ const isIndexedBox: (box: Box) => box is IndexedBox;
13
+ const collectIndexedBoxes: <B extends IndexedBox>(field: Field, type?: Class<B>) => ReadonlyArray<B>;
14
+ }
15
+ //# sourceMappingURL=indexed-box.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexed-box.d.ts","sourceRoot":"","sources":["../src/indexed-box.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAC,MAAM,SAAS,CAAA;AAC7B,OAAO,EAAQ,KAAK,EAAE,GAAG,EAAQ,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAC,UAAU,EAAC,MAAM,aAAa,CAAA;AACtC,OAAO,EAAC,GAAG,EAAC,MAAM,OAAO,CAAA;AAEzB;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;AAE1D,yBAAiB,UAAU,CAAC;IACjB,MAAM,WAAW,GAAI,OAAO,KAAK,EAAE,cAAa,GAA6B,KAAG,GAStF,CAAA;IAEM,MAAM,WAAW,GAAI,OAAO,KAAK,EAAE,aAAa,GAAG,KAAG,IAO5D,CAAA;IAEM,MAAM,YAAY,GAAI,KAAK,GAAG,KAAG,GAAG,IAAI,UAA+D,CAAA;IAEvG,MAAM,mBAAmB,GAAI,CAAC,SAAS,UAAU,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK,CAAC,CAAC,CAAC,KAAG,aAAa,CAAC,CAAC,CAKzC,CAAA;CACnE"}
@@ -0,0 +1,29 @@
1
+ import { clamp, panic } from "@opendaw/lib-std";
2
+ import { Int32Field } from "./primitive";
3
+ export var IndexedBox;
4
+ (function (IndexedBox) {
5
+ IndexedBox.insertOrder = (field, insertIndex = Number.MAX_SAFE_INTEGER) => {
6
+ const boxes = IndexedBox.collectIndexedBoxes(field);
7
+ const newIndex = clamp(insertIndex, 0, boxes.length);
8
+ if (newIndex < boxes.length) {
9
+ for (let index = newIndex; index < boxes.length; index++) {
10
+ boxes[index].index.setValue(index + 1);
11
+ }
12
+ }
13
+ return newIndex;
14
+ };
15
+ IndexedBox.removeOrder = (field, removeIndex) => {
16
+ const boxes = IndexedBox.collectIndexedBoxes(field);
17
+ if (removeIndex < boxes.length) {
18
+ for (let index = removeIndex + 1; index < boxes.length; index++) {
19
+ boxes[index].index.setValue(index - 1);
20
+ }
21
+ }
22
+ };
23
+ IndexedBox.isIndexedBox = (box) => "index" in box && box.index instanceof Int32Field;
24
+ IndexedBox.collectIndexedBoxes = (field, type) => field.pointerHub.incoming()
25
+ .map(({ box }) => IndexedBox.isIndexedBox(box) && (type === undefined || box instanceof type)
26
+ ? box
27
+ : panic(`${box} has no index field`))
28
+ .sort((a, b) => a.index.getValue() - b.index.getValue());
29
+ })(IndexedBox || (IndexedBox = {}));
@@ -5,7 +5,7 @@ export interface PointerListener {
5
5
  onAdd(pointer: PointerField): void;
6
6
  onRemove(pointer: PointerField): void;
7
7
  }
8
- export declare class PointerHub implements Iterable<PointerField> {
8
+ export declare class PointerHub {
9
9
  #private;
10
10
  static validate(pointer: PointerField, target: Vertex): Option<string>;
11
11
  constructor(vertex: Vertex);
@@ -20,7 +20,6 @@ export declare class PointerHub implements Iterable<PointerField> {
20
20
  incoming(): ReadonlyArray<PointerField>;
21
21
  onAdded(pointerField: PointerField): void;
22
22
  onRemoved(pointerField: PointerField): void;
23
- [Symbol.iterator](): Iterator<PointerField>;
24
23
  toString(): string;
25
24
  }
26
25
  //# sourceMappingURL=pointer-hub.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pointer-hub.d.ts","sourceRoot":"","sources":["../src/pointer-hub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAE,YAAY,EAAC,MAAM,WAAW,CAAA;AACpD,OAAO,EAAC,MAAM,EAAC,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAO,GAAG,EAAwB,MAAM,EAAoB,YAAY,EAAC,MAAM,kBAAkB,CAAA;AAGxG,MAAM,WAAW,eAAe;IAC5B,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAA;IAClC,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAA;CACxC;AAED,qBAAa,UAAW,YAAW,QAAQ,CAAC,YAAY,CAAC;;IACrD,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;gBAkB1D,MAAM,EAAE,MAAM;IAO1B,kBAAkB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,GAAG,YAAY;IAInG,oBAAoB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,GAAG,YAAY;IAIrG,8BAA8B,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,GAAG,YAAY;IAoB/G,MAAM,CAAC,CAAC,SAAS,YAAY,EAAE,GAAG,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAKlF,IAAI,IAAI,GAAG;IACX,OAAO,IAAI,OAAO;IAClB,QAAQ,IAAI,OAAO;IACnB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IACxC,QAAQ,IAAI,aAAa,CAAC,YAAY,CAAC;IAEvC,OAAO,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI;IAUzC,SAAS,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI;IAQ3C,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,YAAY,CAAC;IAE3C,QAAQ,IAAI,MAAM;CAuCrB"}
1
+ {"version":3,"file":"pointer-hub.d.ts","sourceRoot":"","sources":["../src/pointer-hub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAE,YAAY,EAAC,MAAM,WAAW,CAAA;AACpD,OAAO,EAAC,MAAM,EAAC,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAO,GAAG,EAAwB,MAAM,EAAoB,YAAY,EAAC,MAAM,kBAAkB,CAAA;AAGxG,MAAM,WAAW,eAAe;IAC5B,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAA;IAClC,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAA;CACxC;AAID,qBAAa,UAAU;;IACnB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;gBAkB1D,MAAM,EAAE,MAAM;IAO1B,kBAAkB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,GAAG,YAAY;IAInG,oBAAoB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,GAAG,YAAY;IAIrG,8BAA8B,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,GAAG,YAAY;IAoB/G,MAAM,CAAC,CAAC,SAAS,YAAY,EAAE,GAAG,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAMlF,IAAI,IAAI,GAAG;IACX,OAAO,IAAI,OAAO;IAClB,QAAQ,IAAI,OAAO;IACnB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IACxC,QAAQ,IAAI,aAAa,CAAC,YAAY,CAAC;IAEvC,OAAO,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI;IAYzC,SAAS,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI;IAU3C,QAAQ,IAAI,MAAM;CAsCrB"}
@@ -30,9 +30,9 @@ export class PointerHub {
30
30
  const added = Address.newSet(pointer => pointer.address);
31
31
  added.addMany(this.filter(...filter));
32
32
  added.forEach(pointer => listener.onAdd(pointer));
33
- // This takes track of the listeners notification state.
33
+ // This takes track of the listener notification state.
34
34
  // It is possible that the pointer has been added, but it has not been notified yet.
35
- // That would cause the listener.onAdd method to be involked twice.
35
+ // That would cause the listener.onAdd method to be invoked twice.
36
36
  return this.subscribeTransactual({
37
37
  onAdd: (pointer) => {
38
38
  if (added.add(pointer)) {
@@ -46,7 +46,7 @@ export class PointerHub {
46
46
  }, ...filter);
47
47
  }
48
48
  filter(...types) {
49
- return (types.length === 0 ? this.incoming() : Iterables.filter(this, (pointerField) => types.some((type) => type === pointerField.pointerType)));
49
+ return (types.length === 0 ? this.incoming() : Iterables.filter(this.incoming().values(), (pointerField) => types.some((type) => type === pointerField.pointerType)));
50
50
  }
51
51
  size() { return this.incoming().length; }
52
52
  isEmpty() { return this.size() === 0; }
@@ -60,20 +60,25 @@ export class PointerHub {
60
60
  }
61
61
  if (this.#inTransaction.isEmpty()) {
62
62
  this.#vertex.graph.subscribeEndTransaction(this.#onEndTransaction);
63
- this.#inTransaction = Option.wrap(new Set(this));
63
+ this.#inTransaction = Option.wrap([{ type: "add", pointerField }]);
64
+ }
65
+ else {
66
+ this.#inTransaction.unwrap().push({ type: "add", pointerField });
64
67
  }
65
68
  this.#immediateListeners.proxy.onAdd(pointerField);
66
69
  }
67
70
  onRemoved(pointerField) {
68
71
  if (this.#inTransaction.isEmpty()) {
69
72
  this.#vertex.graph.subscribeEndTransaction(this.#onEndTransaction);
70
- this.#inTransaction = Option.wrap(new Set(this));
73
+ this.#inTransaction = Option.wrap([{ type: "remove", pointerField }]);
74
+ }
75
+ else {
76
+ this.#inTransaction.unwrap().push({ type: "remove", pointerField });
71
77
  }
72
78
  this.#immediateListeners.proxy.onRemove(pointerField);
73
79
  }
74
- [Symbol.iterator]() { return this.incoming().values(); }
75
80
  toString() {
76
- return `{Pointers ${this.#vertex.address}, pointers: ${Array.from(this)
81
+ return `{Pointers ${this.#vertex.address}, pointers: ${this.incoming().values()
77
82
  .map((pointerField) => pointerField.toString())}}`;
78
83
  }
79
84
  #addFilteredListener(listeners, listener, filter) {
@@ -92,18 +97,19 @@ export class PointerHub {
92
97
  }
93
98
  #onEndTransaction = () => {
94
99
  if (this.#vertex.isAttached()) {
95
- const beforeState = this.#inTransaction.unwrap("Callback without transaction");
96
- const afterState = new Set(this);
97
- beforeState.forEach(pointer => {
98
- if (!afterState.has(pointer)) {
99
- this.#transactualListeners.proxy.onRemove(pointer);
100
+ const log = this.#inTransaction.unwrap("Callback without ChangeLog");
101
+ log.forEach(({ type, pointerField }) => {
102
+ if (type === "add") {
103
+ this.#transactualListeners.proxy.onAdd(pointerField);
100
104
  }
101
- });
102
- afterState.forEach(pointer => {
103
- if (!beforeState.has(pointer)) {
104
- this.#transactualListeners.proxy.onAdd(pointer);
105
+ else if (type === "remove") {
106
+ this.#transactualListeners.proxy.onRemove(pointerField);
107
+ }
108
+ else {
109
+ panic(`Unknown type: ${type}`);
105
110
  }
106
111
  });
112
+ log.length = 0;
107
113
  }
108
114
  this.#inTransaction = Option.None;
109
115
  };
package/dist/pointer.d.ts CHANGED
@@ -24,7 +24,7 @@ export declare class PointerField<P extends PointerTypes = PointerTypes> extends
24
24
  set targetAddress(newValue: Option<Address>);
25
25
  isEmpty(): boolean;
26
26
  nonEmpty(): boolean;
27
- resolve(): void;
27
+ resolvedTo(newTarget: Option<Vertex>): void;
28
28
  read(input: DataInput): void;
29
29
  write(output: DataOutput): void;
30
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pointer.d.ts","sourceRoot":"","sources":["../src/pointer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAsB,YAAY,EAAC,MAAM,kBAAkB,CAAA;AACnH,OAAO,EAAC,MAAM,EAAE,aAAa,EAAC,MAAM,UAAU,CAAA;AAC9C,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AACjC,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAA;AACxC,OAAO,EAAC,KAAK,EAAE,cAAc,EAAC,MAAM,SAAS,CAAA;AAG7C,QAAA,MAAM,gBAAgB,eAA4B,CAAA;AAElD,MAAM,MAAM,mBAAmB,GAAG,OAAO,gBAAgB,CAAA;AAEzD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,mBAAmB,CAAA;AAEhE,qBAAa,YAAY,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,CAAE,SAAQ,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC;;IACtG,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,YAAY,EAAE,SAAS,EAAE,cAAc,CAAC,mBAAmB,CAAC,EAC9C,WAAW,EAAE,CAAC,EACd,SAAS,EAAE,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC;IAU1E,OAAO;IASP,IAAI,UAAU,IAAI,UAAU,CAA+C;IAE3E,IAAI,WAAW,IAAI,CAAC,CAA2B;IAC/C,IAAI,SAAS,IAAI,OAAO,CAAyB;IAEjD,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAI/D,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,YAAY;IAIjD,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,YAAY;IAM3D,KAAK,CAAC,MAAM,SAAS,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,SAAS,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC,GAAG,IAAI;IAInG,KAAK,IAAI,IAAI;IAEb,IAAI,YAAY,IAAI,MAAM,CAAC,MAAM,CAAC,CAIjC;IACD,IAAI,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAQtC;IAED,IAAI,aAAa,IAAI,MAAM,CAAC,OAAO,CAAC,CAA6B;IACjE,IAAI,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,EAM1C;IAED,OAAO,IAAI,OAAO;IAClB,QAAQ,IAAI,OAAO;IAEnB,OAAO,IAAI,IAAI;IASf,IAAI,CAAC,KAAK,EAAE,SAAS;IAIrB,KAAK,CAAC,MAAM,EAAE,UAAU;CAS3B"}
1
+ {"version":3,"file":"pointer.d.ts","sourceRoot":"","sources":["../src/pointer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAsB,YAAY,EAAC,MAAM,kBAAkB,CAAA;AACnH,OAAO,EAAC,MAAM,EAAE,aAAa,EAAC,MAAM,UAAU,CAAA;AAC9C,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AACjC,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAA;AACxC,OAAO,EAAC,KAAK,EAAE,cAAc,EAAC,MAAM,SAAS,CAAA;AAG7C,QAAA,MAAM,gBAAgB,eAA4B,CAAA;AAElD,MAAM,MAAM,mBAAmB,GAAG,OAAO,gBAAgB,CAAA;AAEzD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,mBAAmB,CAAA;AAEhE,qBAAa,YAAY,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,CAAE,SAAQ,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC;;IACtG,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,YAAY,EAAE,SAAS,EAAE,cAAc,CAAC,mBAAmB,CAAC,EAC9C,WAAW,EAAE,CAAC,EACd,SAAS,EAAE,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC;IAU1E,OAAO;IASP,IAAI,UAAU,IAAI,UAAU,CAA+C;IAE3E,IAAI,WAAW,IAAI,CAAC,CAA2B;IAC/C,IAAI,SAAS,IAAI,OAAO,CAAyB;IAEjD,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAI/D,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,YAAY;IAIjD,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,YAAY;IAM3D,KAAK,CAAC,MAAM,SAAS,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,SAAS,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC,GAAG,IAAI;IAInG,KAAK,IAAI,IAAI;IAEb,IAAI,YAAY,IAAI,MAAM,CAAC,MAAM,CAAC,CAIjC;IACD,IAAI,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAQtC;IAED,IAAI,aAAa,IAAI,MAAM,CAAC,OAAO,CAAC,CAA6B;IACjE,IAAI,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,EAM1C;IAED,OAAO,IAAI,OAAO;IAClB,QAAQ,IAAI,OAAO;IAEnB,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI;IAE3C,IAAI,CAAC,KAAK,EAAE,SAAS;IAIrB,KAAK,CAAC,MAAM,EAAE,UAAU;CAS3B"}
package/dist/pointer.js CHANGED
@@ -63,14 +63,7 @@ export class PointerField extends Field {
63
63
  }
64
64
  isEmpty() { return this.targetAddress.isEmpty(); }
65
65
  nonEmpty() { return this.targetAddress.nonEmpty(); }
66
- resolve() {
67
- const targetAddress = this.targetAddress;
68
- const target = targetAddress.flatMap((address) => this.graph.findVertex(address));
69
- if (targetAddress.nonEmpty() && target.isEmpty()) {
70
- return panic(`${targetAddress.unwrapOrNull()?.toString()} could not be resolved`);
71
- }
72
- this.#targetVertex = target;
73
- }
66
+ resolvedTo(newTarget) { this.#targetVertex = newTarget; }
74
67
  read(input) {
75
68
  this.targetAddress = input.readBoolean() ? Option.wrap(Address.read(input)) : Option.None;
76
69
  }
@@ -52,7 +52,7 @@ export class SyncSource {
52
52
  updates.push({
53
53
  type: "update-pointer",
54
54
  address: update.address.decompose(),
55
- target: update.newValue.unwrapOrNull()?.decompose()
55
+ target: update.newAddress.unwrapOrNull()?.decompose()
56
56
  });
57
57
  }
58
58
  else if (update.type === "delete") {
package/dist/updates.d.ts CHANGED
@@ -43,10 +43,10 @@ export declare class PrimitiveUpdate<V extends PrimitiveValues = PrimitiveValues
43
43
  export declare class PointerUpdate implements Modification {
44
44
  #private;
45
45
  readonly type = "pointer";
46
- constructor(address: Address, oldValue: Option<Address>, newValue: Option<Address>);
46
+ constructor(address: Address, oldAddress: Option<Address>, newAddress: Option<Address>);
47
47
  get address(): Address;
48
- get oldValue(): Option<Address>;
49
- get newValue(): Option<Address>;
48
+ get oldAddress(): Option<Address>;
49
+ get newAddress(): Option<Address>;
50
50
  matches(field: PointerField): boolean;
51
51
  inverse(graph: BoxGraph): void;
52
52
  forward(graph: BoxGraph): void;
@@ -1 +1 @@
1
- {"version":3,"file":"updates.d.ts","sourceRoot":"","sources":["../src/updates.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"updates.d.ts","sourceRoot":"","sources":["../src/updates.ts"],"names":[],"mappings":"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"}
package/dist/updates.js CHANGED
@@ -107,19 +107,19 @@ export class PrimitiveUpdate {
107
107
  export class PointerUpdate {
108
108
  type = "pointer";
109
109
  #address;
110
- #oldValue;
111
- #newValue;
112
- constructor(address, oldValue, newValue) {
110
+ #oldAddress;
111
+ #newAddress;
112
+ constructor(address, oldAddress, newAddress) {
113
113
  this.#address = address;
114
- this.#oldValue = oldValue;
115
- this.#newValue = newValue;
114
+ this.#oldAddress = oldAddress;
115
+ this.#newAddress = newAddress;
116
116
  }
117
117
  get address() { return this.#address; }
118
- get oldValue() { return this.#oldValue; }
119
- get newValue() { return this.#newValue; }
118
+ get oldAddress() { return this.#oldAddress; }
119
+ get newAddress() { return this.#newAddress; }
120
120
  matches(field) { return field.address.equals(this.address); }
121
- inverse(graph) { this.field(graph).targetAddress = this.#oldValue; }
122
- forward(graph) { this.field(graph).targetAddress = this.#newValue; }
121
+ inverse(graph) { this.field(graph).targetAddress = this.#oldAddress; }
122
+ forward(graph) { this.field(graph).targetAddress = this.#newAddress; }
123
123
  field(graph) {
124
124
  return graph.findVertex(this.#address)
125
125
  .unwrap(() => `Could not find PointerField at ${this.#address}`);
@@ -127,14 +127,14 @@ export class PointerUpdate {
127
127
  write(output) {
128
128
  output.writeString(this.type);
129
129
  this.#address.write(output);
130
- this.#oldValue.match({
130
+ this.#oldAddress.match({
131
131
  none: () => output.writeBoolean(false),
132
132
  some: address => {
133
133
  output.writeBoolean(true);
134
134
  address.write(output);
135
135
  }
136
136
  });
137
- this.#newValue.match({
137
+ this.#newAddress.match({
138
138
  none: () => output.writeBoolean(false),
139
139
  some: address => {
140
140
  output.writeBoolean(true);
@@ -143,7 +143,7 @@ export class PointerUpdate {
143
143
  });
144
144
  }
145
145
  toString() {
146
- return `{PointerUpdate oldValue: ${this.#oldValue.unwrapOrNull()}, newValue: ${this.#newValue.unwrapOrNull()}`;
146
+ return `{PointerUpdate oldValue: ${this.#oldAddress.unwrapOrNull()}, newValue: ${this.#newAddress.unwrapOrNull()}`;
147
147
  }
148
148
  }
149
149
  export class DeleteUpdate {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opendaw/lib-box",
3
- "version": "0.0.13",
3
+ "version": "0.0.14",
4
4
  "main": "./dist/index.js",
5
5
  "types": "./dist/index.d.ts",
6
6
  "license": "LGPL-3.0-or-later",
@@ -22,12 +22,12 @@
22
22
  "test": "vitest run"
23
23
  },
24
24
  "dependencies": {
25
- "@opendaw/lib-runtime": "^0.0.13",
26
- "@opendaw/lib-std": "^0.0.13"
25
+ "@opendaw/lib-runtime": "^0.0.14",
26
+ "@opendaw/lib-std": "^0.0.14"
27
27
  },
28
28
  "devDependencies": {
29
- "@opendaw/eslint-config": "^0.0.13",
30
- "@opendaw/typescript-config": "^0.0.13"
29
+ "@opendaw/eslint-config": "^0.0.14",
30
+ "@opendaw/typescript-config": "^0.0.14"
31
31
  },
32
- "gitHead": "500bff65c31e5472531b8b76efbde302ac42d602"
32
+ "gitHead": "fddd4acd15f24bb565b6c11a5f8521284da203d0"
33
33
  }