@kanzo-tech/graph 0.13.1 → 0.15.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.
Files changed (121) hide show
  1. package/README.md +12 -15
  2. package/dist/core/categories.d.ts +18 -6
  3. package/dist/core/categories.d.ts.map +1 -1
  4. package/dist/core/categories.js +41 -10
  5. package/dist/core/categories.js.map +1 -1
  6. package/dist/core/channels.d.ts +10 -5
  7. package/dist/core/channels.d.ts.map +1 -1
  8. package/dist/core/channels.js +11 -13
  9. package/dist/core/channels.js.map +1 -1
  10. package/dist/core/detail.d.ts +14 -8
  11. package/dist/core/detail.d.ts.map +1 -1
  12. package/dist/core/detail.js +33 -15
  13. package/dist/core/detail.js.map +1 -1
  14. package/dist/core/filter.d.ts +3 -1
  15. package/dist/core/filter.d.ts.map +1 -1
  16. package/dist/core/filter.js +54 -50
  17. package/dist/core/filter.js.map +1 -1
  18. package/dist/core/load.d.ts +58 -0
  19. package/dist/core/load.d.ts.map +1 -0
  20. package/dist/core/load.js +115 -0
  21. package/dist/core/load.js.map +1 -0
  22. package/dist/core/state.d.ts +31 -56
  23. package/dist/core/state.d.ts.map +1 -1
  24. package/dist/core/store.d.ts +1 -3
  25. package/dist/core/store.d.ts.map +1 -1
  26. package/dist/core/store.js +162 -172
  27. package/dist/core/store.js.map +1 -1
  28. package/dist/core/types.d.ts +21 -17
  29. package/dist/core/types.d.ts.map +1 -1
  30. package/dist/index.d.ts +5 -7
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +19 -25
  33. package/dist/index.js.map +1 -1
  34. package/dist/parts/gesture.d.ts +1 -10
  35. package/dist/parts/gesture.d.ts.map +1 -1
  36. package/dist/parts/gesture.js +26 -28
  37. package/dist/parts/gesture.js.map +1 -1
  38. package/dist/parts/graph-canvas.d.ts.map +1 -1
  39. package/dist/parts/graph-canvas.js +128 -106
  40. package/dist/parts/graph-canvas.js.map +1 -1
  41. package/dist/parts/graph-inspector.d.ts +4 -4
  42. package/dist/parts/graph-inspector.d.ts.map +1 -1
  43. package/dist/parts/graph-inspector.js +55 -57
  44. package/dist/parts/graph-inspector.js.map +1 -1
  45. package/dist/parts/graph-legend.d.ts +4 -4
  46. package/dist/parts/graph-legend.d.ts.map +1 -1
  47. package/dist/parts/graph-legend.js +21 -21
  48. package/dist/parts/graph-legend.js.map +1 -1
  49. package/dist/parts/graph-toolbar.d.ts +1 -1
  50. package/dist/parts/graph-toolbar.d.ts.map +1 -1
  51. package/dist/parts/graph-toolbar.js +40 -40
  52. package/dist/parts/graph-toolbar.js.map +1 -1
  53. package/dist/parts/overlays.d.ts +6 -5
  54. package/dist/parts/overlays.d.ts.map +1 -1
  55. package/dist/parts/overlays.js +70 -68
  56. package/dist/parts/overlays.js.map +1 -1
  57. package/dist/react/use-graph-state.d.ts +4 -2
  58. package/dist/react/use-graph-state.d.ts.map +1 -1
  59. package/dist/react/use-graph-state.js +10 -6
  60. package/dist/react/use-graph-state.js.map +1 -1
  61. package/dist/react/use-graph.d.ts +1 -4
  62. package/dist/react/use-graph.d.ts.map +1 -1
  63. package/dist/react/use-graph.js +38 -49
  64. package/dist/react/use-graph.js.map +1 -1
  65. package/dist/render/graph-looks.d.ts.map +1 -1
  66. package/dist/render/graph-looks.js.map +1 -1
  67. package/dist/render/graph-model.d.ts +6 -8
  68. package/dist/render/graph-model.d.ts.map +1 -1
  69. package/dist/render/graph-model.js +51 -57
  70. package/dist/render/graph-model.js.map +1 -1
  71. package/dist/render/graph-sim.d.ts +2 -3
  72. package/dist/render/graph-sim.d.ts.map +1 -1
  73. package/dist/render/graph-sim.js.map +1 -1
  74. package/dist/render/renderer.d.ts +10 -10
  75. package/dist/render/renderer.d.ts.map +1 -1
  76. package/dist/render/renderer.js +121 -177
  77. package/dist/render/renderer.js.map +1 -1
  78. package/dist/section.d.ts.map +1 -1
  79. package/dist/section.js +3 -7
  80. package/dist/section.js.map +1 -1
  81. package/package.json +29 -10
  82. package/dist/core/refine.d.ts +0 -14
  83. package/dist/core/refine.d.ts.map +0 -1
  84. package/dist/core/refine.js +0 -20
  85. package/dist/core/refine.js.map +0 -1
  86. package/dist/core/resident.d.ts +0 -79
  87. package/dist/core/resident.d.ts.map +0 -1
  88. package/dist/core/resident.js +0 -44
  89. package/dist/core/resident.js.map +0 -1
  90. package/dist/core/scheduler.d.ts +0 -42
  91. package/dist/core/scheduler.d.ts.map +0 -1
  92. package/dist/core/scheduler.js +0 -77
  93. package/dist/core/scheduler.js.map +0 -1
  94. package/dist/core/tile-matrix.d.ts +0 -37
  95. package/dist/core/tile-matrix.d.ts.map +0 -1
  96. package/dist/core/tile-matrix.js +0 -49
  97. package/dist/core/tile-matrix.js.map +0 -1
  98. package/dist/core/tile.d.ts +0 -54
  99. package/dist/core/tile.d.ts.map +0 -1
  100. package/dist/core/tile.js +0 -76
  101. package/dist/core/tile.js.map +0 -1
  102. package/dist/core/tileset.d.ts +0 -59
  103. package/dist/core/tileset.d.ts.map +0 -1
  104. package/dist/core/tileset.js +0 -177
  105. package/dist/core/tileset.js.map +0 -1
  106. package/dist/render/adaptive.d.ts +0 -27
  107. package/dist/render/adaptive.d.ts.map +0 -1
  108. package/dist/render/adaptive.js +0 -25
  109. package/dist/render/adaptive.js.map +0 -1
  110. package/dist/render/compose.d.ts +0 -51
  111. package/dist/render/compose.d.ts.map +0 -1
  112. package/dist/render/compose.js +0 -107
  113. package/dist/render/compose.js.map +0 -1
  114. package/dist/render/encode.d.ts +0 -42
  115. package/dist/render/encode.d.ts.map +0 -1
  116. package/dist/render/encode.js +0 -68
  117. package/dist/render/encode.js.map +0 -1
  118. package/dist/render/when-ready.d.ts +0 -35
  119. package/dist/render/when-ready.d.ts.map +0 -1
  120. package/dist/render/when-ready.js +0 -17
  121. package/dist/render/when-ready.js.map +0 -1
@@ -1,66 +1,32 @@
1
- import { PAYLOAD_ADDRESS as le, PAYLOAD_COORDINATES as oe } from "@fossil-lang/corpus";
2
- import { domainOf as re } from "./categories.js";
3
- import { bindingOf as Y, projectionOf as ie } from "./channels.js";
4
- import { graphClient as se, publish as ce, filterFor as fe } from "./filter.js";
5
- import { denseOf as ue } from "./resident.js";
6
- import { Tileset2D as de } from "./tileset.js";
7
- const R = 2e4, H = Y({}), Q = le[0];
8
- function ae(i) {
9
- var p;
10
- let n = 0;
11
- for (const s of i.edges) n += s.src.byteLength + s.dst.byteLength + (((p = s.weight) == null ? void 0 : p.byteLength) ?? 0);
12
- return n + i.rows.numRows * 8 * 4;
13
- }
14
- const pe = (i, n) => JSON.stringify(i, (p, s) => typeof s == "bigint" ? `${s}n` : s) === JSON.stringify(n, (p, s) => typeof s == "bigint" ? `${s}n` : s), me = (i) => typeof (i == null ? void 0 : i.then) == "function";
15
- function W(i, n) {
16
- return i.length !== n.length ? n : n.every((p, s) => {
17
- var r;
18
- return p.content === ((r = i[s]) == null ? void 0 : r.content);
19
- }) ? i : n;
1
+ import { domainOf as Y } from "./categories.js";
2
+ import { bindingOf as Q } from "./channels.js";
3
+ import { graphClient as Z, publish as x, filterFor as ee } from "./filter.js";
4
+ import { drawnTables as ne, loadEncoding as te, loadGraph as re, maskOf as U, readKept as oe } from "./load.js";
5
+ const le = (a, r) => JSON.stringify(a, (p, s) => typeof s == "bigint" ? `${s}n` : s) === JSON.stringify(r, (p, s) => typeof s == "bigint" ? `${s}n` : s), se = (a) => typeof (a == null ? void 0 : a.then) == "function";
6
+ function ie(a, r, p) {
7
+ const s = r.domain.map(() => 0);
8
+ let l = 0;
9
+ for (let i = 0; i < a.size; i++) {
10
+ if (p && !p[i] || Number.isNaN(a.positions[i * 2])) continue;
11
+ l++;
12
+ const b = r.ranks[i];
13
+ s[b] = (s[b] ?? 0) + 1;
14
+ }
15
+ return { vertices: l, domain: r.domain, tally: s };
20
16
  }
21
- function Le(i) {
22
- let n = i;
23
- const p = /* @__PURE__ */ new Set(), s = se();
24
- let r = null, h = null, M = !1, F = !1, c = null, S = 0, G = null, L = null, y = H, P, z = null, E = [], A = null, g = null, B = !1, J = -1, V = !0, I = null;
25
- const D = (e) => {
26
- const t = e instanceof Error ? e.message : String(e);
27
- V ? I = t : n.onFailure(t);
28
- }, d = new de({
29
- debounceTime: 60,
30
- load: async (e, t) => {
31
- if (!r || !L) throw new Error("the graph has no scan to read with");
32
- const l = (w) => {
33
- var O;
34
- return ((O = c == null ? void 0 : c.tileMatrices[w.z]) == null ? void 0 : O.kind) === "cells";
35
- }, o = await L.read(e, { signal: t }), m = await r.edges({ from: e, direction: "src", signal: t }), a = e.filter((w) => !l(w)), b = a.length > 0 ? await r.edges({ from: a, direction: "dst", signal: t }) : [], x = new Map(a.map((w, O) => [w, b[O]]));
36
- return e.map((w, O) => {
37
- const v = m[O], T = x.get(w), ee = [...(v == null ? void 0 : v.batches) ?? [], ...(T == null ? void 0 : T.batches) ?? []], U = [...(v == null ? void 0 : v.declined) ?? [], ...(T == null ? void 0 : T.declined) ?? []], te = l(w) ? U.filter((ne) => ne.direction !== "dst") : U, q = { rows: o[O], edges: ee, declined: te };
38
- return { ...q, byteLength: ae(q) };
39
- });
40
- },
41
- onTileLoad: (e) => {
42
- var t;
43
- for (const l of ((t = e.content) == null ? void 0 : t.declined) ?? [])
44
- E.some((o) => o.edgeType === l.edgeType && o.direction === l.direction) || (E = [...E, l]);
45
- d.refresh(), u();
46
- },
47
- onTileError: (e) => {
48
- d.refresh(), D(e), u();
49
- }
50
- });
51
- let f = {
17
+ function de(a) {
18
+ let r = a;
19
+ const p = /* @__PURE__ */ new Set(), s = Z();
20
+ let l = null, i = null, b = !1, _ = !1, g = [], d = Q(a), F, m = null, u = null, f = null, w = null, B = null, k = null, T = [], h = null, N = !1, D = !0, z = null;
21
+ const S = (e) => {
22
+ const n = e instanceof Error ? e.message : String(e);
23
+ D ? z = n : r.onFailure(n);
24
+ };
25
+ let c = {
52
26
  status: "none",
53
- matrix: null,
54
- typeIndex: 0,
55
- modeColumn: null,
56
- binding: H,
57
- domain: [],
58
- z: null,
59
- visible: [],
60
- cached: [],
61
- pending: !1,
62
27
  total: void 0,
63
- declined: [],
28
+ drawn: null,
29
+ domain: [],
64
30
  selection: null,
65
31
  focus: null,
66
32
  hovered: null,
@@ -68,171 +34,195 @@ function Le(i) {
68
34
  tool: null,
69
35
  motion: "settled",
70
36
  progress: 1,
71
- drawn: null,
72
- options: n,
73
- corpus: null
74
- };
75
- const $ = (e) => {
76
- var t;
77
- return {
78
- address: e.address,
79
- kind: ((t = c == null ? void 0 : c.tileMatrices[e.address.z]) == null ? void 0 : t.kind) ?? "rows",
80
- content: e.content
81
- };
82
- };
83
- let _ = { key: [], value: [] };
84
- function X() {
85
- const e = [r, S, y.category, n.categories];
86
- return e.some((t, l) => t !== _.key[l]) && (_ = { key: e, value: re(r, S, y, n.categories) }), _.value;
37
+ options: r,
38
+ corpus: null,
39
+ binding: d,
40
+ geometry: null,
41
+ encoding: null,
42
+ mask: null
43
+ }, $ = { key: [], value: [] };
44
+ function K() {
45
+ const e = [g, d.byTable, d.category, r.categories];
46
+ return e.some((n, t) => n !== $.key[t]) && ($ = { key: e, value: Y(g, d, r.categories) }), $.value;
47
+ }
48
+ let C = { key: [], value: null };
49
+ function V() {
50
+ const e = [f, w, k];
51
+ return e.some((n, t) => n !== C.key[t]) && (C = { key: e, value: f && w ? ie(f, w, k) : null }), C.value;
87
52
  }
88
- function Z(e, t) {
89
- return M || F ? "failed" : h ? "opening" : r ? e || A !== t || f.drawn === null ? "reading" : "idle" : "none";
53
+ function W() {
54
+ if (b || _) return "failed";
55
+ if (i) return "opening";
56
+ if (!l) return "none";
57
+ const n = f !== null && [f, w, k].every((t, o) => t === T[o]);
58
+ return m || u || !n ? "loading" : "idle";
90
59
  }
91
- function u(e = {}) {
92
- var m;
93
- J = d.frame;
94
- const t = d.tiles.filter((a) => a.content !== null), l = W(f.visible, t.filter((a) => a.isVisible).map($)), o = d.selectedTiles.some((a) => a.isLoading);
95
- f = {
96
- ...f,
97
- matrix: c,
98
- typeIndex: S,
99
- modeColumn: G,
100
- binding: y,
101
- domain: X(),
102
- z: d.z,
103
- visible: l,
104
- cached: W(f.cached, t.map($)),
105
- pending: o,
106
- total: c ? Number(((m = c.tileMatrices[c.tileMatrices.length - 1]) == null ? void 0 : m.count) ?? 0) : void 0,
107
- declined: E,
108
- options: n,
109
- corpus: r,
60
+ function y(e = {}) {
61
+ c = {
62
+ ...c,
63
+ total: l ? g.reduce((n, t) => n + t.record_count, 0) : void 0,
64
+ drawn: V(),
65
+ domain: K(),
66
+ options: r,
67
+ corpus: l,
68
+ binding: d,
69
+ geometry: f,
70
+ encoding: w,
71
+ mask: k,
110
72
  ...e
111
- }, f = { ...f, status: Z(o, f.visible) };
112
- for (const a of p) a();
73
+ }, c = { ...c, status: W() }, R();
113
74
  }
114
- function C() {
115
- if (!(!r || !c)) {
116
- try {
117
- const e = [Q, ...oe];
118
- L = r.scan({ type: c.type, filter: P, select: ie(y, e) }), d.setPlan(L.plan());
119
- } catch (e) {
120
- L = null, d.setPlan([]), D(e);
75
+ function v(e) {
76
+ c = { ...c, ...e }, R();
77
+ }
78
+ function R() {
79
+ for (const e of p) e();
80
+ }
81
+ function G(e, n, t, o, L) {
82
+ var E;
83
+ (E = e()) == null || E.abort();
84
+ const O = new AbortController();
85
+ n(O), o(O.signal).then(
86
+ (A) => {
87
+ e() === O && (n(null), L(A), y());
88
+ },
89
+ (A) => {
90
+ e() === O && (n(null), b || (b = t), S(A), y());
121
91
  }
122
- d.reloadAll(), z && d.update(z, n.limit ?? R), u();
92
+ );
93
+ }
94
+ const j = [() => m, (e) => m = e, !0], X = [() => u, (e) => u = e, !1];
95
+ function q() {
96
+ const e = l;
97
+ if (!e) return;
98
+ const n = K(), t = f;
99
+ if (t)
100
+ return G(...j, (o) => te(e, t, d, n, o), (o) => {
101
+ w = o;
102
+ });
103
+ G(...j, (o) => re(e, d, n, o), (o) => {
104
+ f = o.geometry, w = o.encoding, k = f && B ? U(f, B) : null;
105
+ });
106
+ }
107
+ function H() {
108
+ u == null || u.abort(), u = null;
109
+ const e = l;
110
+ if (!e || g.length === 0) return;
111
+ if (F === void 0) {
112
+ B = null, k = null;
113
+ return;
123
114
  }
115
+ const n = F;
116
+ G(...X, (t) => oe(e, g, n, t), (t) => {
117
+ B = t, k = f ? U(f, t) : null;
118
+ });
124
119
  }
125
- function N() {
126
- var o, m, a;
127
- M = !1, c = null, L = null, E = [], A = null, d.finalize();
128
- const e = { selection: null, focus: null, hovered: null, pinned: [], drawn: null };
129
- if (!r) return u(e);
130
- const t = r.types.vertices, l = n.type ?? ((o = t.find((b) => b.geometry)) == null ? void 0 : o.type) ?? ((m = t[0]) == null ? void 0 : m.type);
131
- S = Math.max(0, t.findIndex((b) => b.type === l));
120
+ function J() {
121
+ m == null || m.abort(), u == null || u.abort(), m = u = null, b = !1, f = w = k = B = null, T = [], g = [];
122
+ const e = { selection: null, focus: null, hovered: null, pinned: [] };
123
+ if (!l) return y(e);
132
124
  try {
133
- if (l === void 0) throw new Error("the corpus has no vertex type to draw");
134
- c = r.tileMatrix(l), G = ((a = c.mode) == null ? void 0 : a.column) ?? null, d.setMatrix(c);
135
- } catch (b) {
136
- M = !0, D(b);
125
+ if (l.manifest.format !== "fossil/1") throw new Error(`the graph reads fossil/1, and this corpus is ${l.manifest.format}`);
126
+ if (g = ne(l), g.length === 0) throw new Error("the corpus has no vertex type with a position to draw");
127
+ } catch (n) {
128
+ return b = !0, S(n), y(e);
137
129
  }
138
- f = { ...f, ...e }, C();
130
+ q(), H(), y(e);
139
131
  }
140
- function j(e) {
141
- if (r = null, h = me(e) ? e : null, !h)
142
- return r = e, N();
143
- const t = h;
144
- N(), t.then(
145
- (l) => {
146
- h === t && (h = null, r = l, N());
132
+ function I(e) {
133
+ if (l = null, i = se(e) ? e : null, !i)
134
+ return l = e, J();
135
+ const n = i;
136
+ J(), n.then(
137
+ (t) => {
138
+ i === n && (i = null, l = t, J());
147
139
  },
148
- (l) => {
149
- h === t && (h = null, M = !0, D(l), u());
140
+ (t) => {
141
+ i === n && (i = null, b = !0, S(t), y());
150
142
  }
151
143
  );
152
144
  }
153
- function k() {
154
- g == null || g(), g = null;
155
- const e = n.filterBy, t = () => {
156
- let l;
145
+ function P() {
146
+ h == null || h(), h = null;
147
+ const e = r.filterBy, n = () => {
148
+ let t;
157
149
  try {
158
- l = e ? fe(e, s) : void 0;
150
+ t = e ? ee(e, s) : void 0;
159
151
  } catch (o) {
160
- D(o);
152
+ S(o);
161
153
  return;
162
154
  }
163
- pe(l, P) || (P = l, C());
155
+ le(t, F) || (F = t, H(), y());
164
156
  };
165
- e && (e.addEventListener("value", t), g = () => e.removeEventListener("value", t)), t();
157
+ e && (e.addEventListener("value", n), h = () => e.removeEventListener("value", n)), n();
166
158
  }
167
- const K = {
159
+ const M = {
168
160
  /**
169
161
  * The first subscriber starts listening to the crossfilter and the last one stops it and lets the
170
- * tiles go — `QueryObserver`'s `onSubscribe`/`onUnsubscribe`, which is what survives StrictMode
162
+ * graph go — `QueryObserver`'s `onSubscribe`/`onUnsubscribe`, which is what survives StrictMode
171
163
  * mounting everything twice.
172
164
  */
173
165
  subscribe(e) {
174
- if (p.add(e), !B && (B = !0, k(), I !== null)) {
175
- const t = I;
176
- I = null, n.onFailure(t);
166
+ if (p.add(e), !N && (N = !0, P(), z !== null)) {
167
+ const n = z;
168
+ z = null, r.onFailure(n);
177
169
  }
178
170
  return () => {
179
- p.delete(e), p.size === 0 && K.destroy();
171
+ p.delete(e), p.size === 0 && M.destroy();
180
172
  };
181
173
  },
182
- getSnapshot: () => f,
183
- getOptions: () => n,
174
+ getSnapshot: () => c,
175
+ getOptions: () => r,
184
176
  setOptions(e) {
185
- const t = n;
186
- n = e;
187
- const l = Y(e), o = l.category !== y.category || l.size !== y.size || l.title !== y.title;
188
- if (y = l, e.corpus !== t.corpus || e.type !== t.type) {
189
- e.corpus !== t.corpus ? j(e.corpus) : N(), B && e.filterBy !== t.filterBy && k();
177
+ const n = r;
178
+ r = e;
179
+ const t = Q(e), o = t.category !== d.category || t.byTable !== d.byTable || t.size !== d.size || e.categories !== n.categories;
180
+ if (d = t, e.corpus !== n.corpus) {
181
+ I(e.corpus), N && e.filterBy !== n.filterBy && P();
190
182
  return;
191
183
  }
192
- if (B && e.filterBy !== t.filterBy && k(), o) return C();
193
- e.limit !== t.limit && z && d.update(z, e.limit ?? R), u();
184
+ N && e.filterBy !== n.filterBy && P(), o && q(), y();
194
185
  },
195
186
  destroy() {
196
- B = !1, g == null || g(), g = null, d.finalize(), p.clear();
197
- },
198
- setViewport(e) {
199
- z = e, d.update(e, n.limit ?? R) !== J && u();
187
+ N = !1, h == null || h(), h = null, m == null || m.abort(), u == null || u.abort(), p.clear();
200
188
  },
201
- select(e, t = "node", l = "") {
202
- var m;
203
- const o = e && e.length > 0 ? { vertices: [...e], source: t, label: l } : null;
204
- u({ selection: o }), (m = n.onSelect) == null || m.call(n, o), n.filterBy && ce(n.filterBy, s, Q, o ? o.vertices.map(ue) : null);
189
+ select(e, n = "node", t = "") {
190
+ var O, E;
191
+ const o = e && e.length > 0 ? { vertices: [...e], source: n, label: t } : null;
192
+ v({ selection: o }), (O = r.onSelect) == null || O.call(r, o);
193
+ const L = (E = g[0]) == null ? void 0 : E.key;
194
+ r.filterBy && L && x(r.filterBy, s, L, o ? o.vertices : null);
205
195
  },
206
196
  focus(e) {
207
- var t;
208
- e !== f.focus && (u({ focus: e }), (t = n.onFocus) == null || t.call(n, e));
197
+ var n;
198
+ e !== c.focus && (v({ focus: e }), (n = r.onFocus) == null || n.call(r, e));
209
199
  },
210
200
  hover(e) {
211
- e !== f.hovered && u({ hovered: e });
201
+ e !== c.hovered && v({ hovered: e });
212
202
  },
213
203
  pin(e) {
214
- u({ pinned: [...e] });
204
+ v({ pinned: [...e] });
215
205
  },
216
206
  setTool(e) {
217
- e !== f.tool && u({ tool: e });
207
+ e !== c.tool && v({ tool: e });
218
208
  },
219
209
  report(e) {
220
- e !== f.motion && u({ motion: e });
210
+ e !== c.motion && v({ motion: e });
221
211
  },
222
212
  reportProgress(e) {
223
- e !== f.progress && u({ progress: e });
213
+ e !== c.progress && v({ progress: e });
224
214
  },
225
215
  setRenderable(e) {
226
- F !== !e && (F = !e, u());
216
+ _ !== !e && (_ = !e, y());
227
217
  },
228
- reportDrawn(e, t) {
229
- A === e && t === null || (A = e, u(t ? { drawn: t } : {}));
218
+ reportDrawn(e) {
219
+ const n = [e.geometry, e.encoding, e.mask];
220
+ n.every((t, o) => t === T[o]) || (T = n, y());
230
221
  }
231
222
  };
232
- return y = Y(i), j(i.corpus), V = !1, K;
223
+ return I(a.corpus), D = !1, M;
233
224
  }
234
225
  export {
235
- R as DEFAULT_LIMIT,
236
- Le as createGraph
226
+ de as createGraph
237
227
  };
238
228
  //# sourceMappingURL=store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sources":["../../src/core/store.ts"],"sourcesContent":["import {\n PAYLOAD_ADDRESS,\n PAYLOAD_COORDINATES,\n type Batch,\n type Corpus,\n type Filter,\n type Gap,\n type Scan,\n type TileAddress,\n type TileMatrixSet,\n} from \"@fossil-lang/corpus\";\nimport type { MosaicClient } from \"@kanzo-tech/mosaic\";\nimport { domainOf } from \"./categories\";\nimport { bindingOf, projectionOf, type Binding } from \"./channels\";\nimport { filterFor, graphClient, publish } from \"./filter\";\nimport { denseOf } from \"./resident\";\nimport type { GraphOptions, GraphSnapshot, GraphStatus, GraphStore, TileView } from \"./state\";\nimport type { TileContent } from \"./tile\";\nimport type { Viewport } from \"./tile-matrix\";\nimport { Tileset2D } from \"./tileset\";\n\nexport type { Drawn, GraphOptions, GraphSnapshot, GraphState, GraphStatus, GraphStore, TileView } from \"./state\";\n\n/** Twenty thousand marks: what a canvas draws at once before a coarser zoom is chosen. */\nexport const DEFAULT_LIMIT = 20_000;\n\nconst NO_BINDING: Binding = bindingOf({});\nconst KEY = PAYLOAD_ADDRESS[0] as string;\n\nfunction bytesOf(content: Omit<TileContent, \"byteLength\">): number {\n let bytes = 0;\n for (const edge of content.edges) bytes += edge.src.byteLength + edge.dst.byteLength + (edge.weight?.byteLength ?? 0);\n return bytes + content.rows.numRows * 8 * 4;\n}\n\nconst sameFilter = (a: Filter | undefined, b: Filter | undefined) =>\n JSON.stringify(a, (_, v: unknown) => (typeof v === \"bigint\" ? `${v}n` : v)) ===\n JSON.stringify(b, (_, v: unknown) => (typeof v === \"bigint\" ? `${v}n` : v));\n\nconst isPromise = (value: unknown): value is PromiseLike<Corpus> =>\n typeof (value as PromiseLike<Corpus> | null)?.then === \"function\";\n\n/** The same array while the set of tiles in it is the same, so a reader can compare by identity. */\nfunction keep(previous: readonly TileView[], next: TileView[]): readonly TileView[] {\n if (previous.length !== next.length) return next;\n return next.every((view, i) => view.content === previous[i]?.content) ? previous : next;\n}\n\nexport function createGraph(initial: GraphOptions): GraphStore {\n let options = initial;\n const listeners = new Set<() => void>();\n const self: MosaicClient = graphClient();\n\n let corpus: Corpus | null = null;\n let opening: PromiseLike<Corpus> | null = null;\n let failed = false;\n let unrenderable = false;\n let matrix: TileMatrixSet | null = null;\n let typeIndex = 0;\n let modeColumn: string | null = null;\n let scan: Scan | null = null;\n let binding = NO_BINDING;\n let filter: Filter | undefined;\n let viewport: Viewport | null = null;\n let declined: Gap[] = [];\n let composed: readonly TileView[] | null = null;\n let unlisten: (() => void) | null = null;\n let active = false;\n let lastFrame = -1;\n\n // A failure found while the store is being built is found while React is still rendering —\n // `useGraph` builds it in `useState` — and a host's `onFailure` is usually a `setState`. It is held\n // and reported to the first subscriber, which arrives in the commit phase. Anything later is\n // asynchronous or effect-driven and is reported as it happens.\n let building = true;\n let held: string | null = null;\n const fail = (error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n if (building) held = message;\n else options.onFailure(message);\n };\n\n const tileset = new Tileset2D({\n debounceTime: 60,\n load: async (addresses, signal) => {\n if (!corpus || !scan) throw new Error(\"the graph has no scan to read with\");\n const isCells = (address: TileAddress) => matrix?.tileMatrices[address.z]?.kind === \"cells\";\n const rows = await scan.read(addresses, { signal });\n const src = await corpus.edges({ from: addresses, direction: \"src\", signal });\n const payload = addresses.filter((address) => !isCells(address));\n const dst = payload.length > 0 ? await corpus.edges({ from: payload, direction: \"dst\", signal }) : [];\n const dstOf = new Map(payload.map((address, i) => [address, dst[i]]));\n return addresses.map((address, i) => {\n const out = src[i];\n const back = dstOf.get(address);\n const edges = [...(out?.batches ?? []), ...(back?.batches ?? [])];\n const gaps = [...(out?.declined ?? []), ...(back?.declined ?? [])];\n const declined = isCells(address) ? gaps.filter((gap) => gap.direction !== \"dst\") : gaps;\n const content = { rows: rows[i] as Batch, edges, declined };\n return { ...content, byteLength: bytesOf(content) };\n });\n },\n onTileLoad: (tile) => {\n for (const gap of tile.content?.declined ?? []) {\n if (!declined.some((d) => d.edgeType === gap.edgeType && d.direction === gap.direction)) {\n declined = [...declined, gap];\n }\n }\n tileset.refresh();\n notify();\n },\n onTileError: (error) => {\n tileset.refresh();\n fail(error);\n notify();\n },\n });\n\n let snapshot: GraphSnapshot = {\n status: \"none\",\n matrix: null,\n typeIndex: 0,\n modeColumn: null,\n binding: NO_BINDING,\n domain: [],\n z: null,\n visible: [],\n cached: [],\n pending: false,\n total: undefined,\n declined: [],\n selection: null,\n focus: null,\n hovered: null,\n pinned: [],\n tool: null,\n motion: \"settled\",\n progress: 1,\n drawn: null,\n options,\n corpus: null,\n };\n\n const viewOf = (tile: { address: TileAddress; content: TileContent | null }): TileView => ({\n address: tile.address,\n kind: matrix?.tileMatrices[tile.address.z]?.kind ?? \"rows\",\n content: tile.content as TileContent,\n });\n\n let domain: { key: unknown[]; value: readonly unknown[] } = { key: [], value: [] };\n function domainNow(): readonly unknown[] {\n const key = [corpus, typeIndex, binding.category, options.categories];\n if (key.some((part, i) => part !== domain.key[i])) domain = { key, value: domainOf(corpus, typeIndex, binding, options.categories) };\n return domain.value;\n }\n\n function statusOf(pending: boolean, visible: readonly TileView[]): GraphStatus {\n if (failed || unrenderable) return \"failed\";\n if (opening) return \"opening\";\n if (!corpus) return \"none\";\n return pending || composed !== visible || snapshot.drawn === null ? \"reading\" : \"idle\";\n }\n\n function notify(patch: Partial<GraphSnapshot> = {}): void {\n lastFrame = tileset.frame;\n const tiles = tileset.tiles.filter((tile) => tile.content !== null);\n const visible = keep(snapshot.visible, tiles.filter((tile) => tile.isVisible).map(viewOf));\n const pending = tileset.selectedTiles.some((tile) => tile.isLoading);\n snapshot = {\n ...snapshot,\n matrix,\n typeIndex,\n modeColumn,\n binding,\n domain: domainNow(),\n z: tileset.z,\n visible,\n cached: keep(snapshot.cached, tiles.map(viewOf)),\n pending,\n total: matrix ? Number(matrix.tileMatrices[matrix.tileMatrices.length - 1]?.count ?? 0) : undefined,\n declined,\n options,\n corpus,\n ...patch,\n };\n snapshot = { ...snapshot, status: statusOf(pending, snapshot.visible) };\n for (const listener of listeners) listener();\n }\n\n /** A binding or a filter is a new scan, planned once and never per camera move. */\n function rescan(): void {\n if (!corpus || !matrix) return;\n try {\n const fixed = [KEY, ...PAYLOAD_COORDINATES];\n scan = corpus.scan({ type: matrix.type, filter, select: projectionOf(binding, fixed) });\n tileset.setPlan(scan.plan());\n } catch (error) {\n scan = null;\n tileset.setPlan([]);\n fail(error);\n }\n tileset.reloadAll();\n if (viewport) tileset.update(viewport, options.limit ?? DEFAULT_LIMIT);\n notify();\n }\n\n function reopen(): void {\n failed = false;\n matrix = null;\n scan = null;\n declined = [];\n composed = null;\n tileset.finalize();\n const cleared = { selection: null, focus: null, hovered: null, pinned: [], drawn: null };\n if (!corpus) return notify(cleared);\n const types = corpus.types.vertices;\n const type = options.type ?? types.find((t) => t.geometry)?.type ?? types[0]?.type;\n typeIndex = Math.max(0, types.findIndex((t) => t.type === type));\n try {\n if (type === undefined) throw new Error(\"the corpus has no vertex type to draw\");\n matrix = corpus.tileMatrix(type);\n modeColumn = matrix.mode?.column ?? null;\n tileset.setMatrix(matrix);\n } catch (error) {\n failed = true;\n fail(error);\n }\n snapshot = { ...snapshot, ...cleared };\n rescan();\n }\n\n /** A promise is adopted when it settles, and only if it is still the corpus the host means. */\n function adopt(given: GraphOptions[\"corpus\"]): void {\n corpus = null;\n opening = isPromise(given) ? given : null;\n if (!opening) {\n corpus = given as Corpus | null;\n return reopen();\n }\n const promised = opening;\n reopen();\n promised.then(\n (opened) => {\n if (opening !== promised) return;\n opening = null;\n corpus = opened;\n reopen();\n },\n (error: unknown) => {\n if (opening !== promised) return;\n opening = null;\n failed = true;\n fail(error);\n notify();\n },\n );\n }\n\n function listen(): void {\n unlisten?.();\n unlisten = null;\n const crossfilter = options.filterBy;\n const refilter = () => {\n let next: Filter | undefined;\n try {\n next = crossfilter ? filterFor(crossfilter, self) : undefined;\n } catch (error) {\n fail(error);\n return;\n }\n if (sameFilter(next, filter)) return;\n filter = next;\n rescan();\n };\n if (crossfilter) {\n crossfilter.addEventListener(\"value\", refilter);\n unlisten = () => crossfilter.removeEventListener(\"value\", refilter);\n }\n refilter();\n }\n\n const store: GraphStore = {\n /**\n * The first subscriber starts listening to the crossfilter and the last one stops it and lets the\n * tiles go — `QueryObserver`'s `onSubscribe`/`onUnsubscribe`, which is what survives StrictMode\n * mounting everything twice.\n */\n subscribe(listener) {\n listeners.add(listener);\n if (!active) {\n active = true;\n listen();\n if (held !== null) {\n const message = held;\n held = null;\n options.onFailure(message);\n }\n }\n return () => {\n listeners.delete(listener);\n if (listeners.size === 0) store.destroy();\n };\n },\n getSnapshot: () => snapshot,\n getOptions: () => options,\n setOptions(next) {\n const previous = options;\n options = next;\n const nextBinding = bindingOf(next);\n const rebound =\n nextBinding.category !== binding.category ||\n nextBinding.size !== binding.size ||\n nextBinding.title !== binding.title;\n binding = nextBinding;\n if (next.corpus !== previous.corpus || next.type !== previous.type) {\n if (next.corpus !== previous.corpus) adopt(next.corpus);\n else reopen();\n if (active && next.filterBy !== previous.filterBy) listen();\n return;\n }\n if (active && next.filterBy !== previous.filterBy) listen();\n if (rebound) return rescan();\n if (next.limit !== previous.limit && viewport) tileset.update(viewport, next.limit ?? DEFAULT_LIMIT);\n notify();\n },\n destroy() {\n active = false;\n unlisten?.();\n unlisten = null;\n tileset.finalize();\n listeners.clear();\n },\n setViewport(next) {\n viewport = next;\n if (tileset.update(next, options.limit ?? DEFAULT_LIMIT) !== lastFrame) notify();\n },\n select(vertices, source = \"node\", label = \"\") {\n const selection = vertices && vertices.length > 0 ? { vertices: [...vertices], source, label } : null;\n notify({ selection });\n options.onSelect?.(selection);\n if (options.filterBy) publish(options.filterBy, self, KEY, selection ? selection.vertices.map(denseOf) : null);\n },\n focus(vertex) {\n if (vertex === snapshot.focus) return;\n notify({ focus: vertex });\n options.onFocus?.(vertex);\n },\n hover(vertex) {\n if (vertex !== snapshot.hovered) notify({ hovered: vertex });\n },\n pin(vertices) {\n notify({ pinned: [...vertices] });\n },\n setTool(tool) {\n if (tool !== snapshot.tool) notify({ tool });\n },\n report(motion) {\n if (motion !== snapshot.motion) notify({ motion });\n },\n reportProgress(value) {\n if (value !== snapshot.progress) notify({ progress: value });\n },\n setRenderable(renderable) {\n if (unrenderable === !renderable) return;\n unrenderable = !renderable;\n notify();\n },\n reportDrawn(visible, drawn) {\n if (composed === visible && drawn === null) return;\n composed = visible;\n notify(drawn ? { drawn } : {});\n },\n };\n\n binding = bindingOf(initial);\n adopt(initial.corpus);\n building = false;\n return store;\n}\n"],"names":["DEFAULT_LIMIT","NO_BINDING","bindingOf","KEY","PAYLOAD_ADDRESS","bytesOf","content","bytes","edge","_a","sameFilter","a","b","_","v","isPromise","value","keep","previous","next","view","i","createGraph","initial","options","listeners","self","graphClient","corpus","opening","failed","unrenderable","matrix","typeIndex","modeColumn","scan","binding","filter","viewport","declined","composed","unlisten","active","lastFrame","building","held","fail","error","message","tileset","Tileset2D","addresses","signal","isCells","address","rows","src","payload","dst","dstOf","out","back","edges","gaps","gap","tile","d","notify","snapshot","viewOf","domain","domainNow","key","part","domainOf","statusOf","pending","visible","patch","tiles","listener","rescan","fixed","PAYLOAD_COORDINATES","projectionOf","reopen","cleared","types","type","t","_b","_c","adopt","given","promised","opened","listen","crossfilter","refilter","filterFor","store","nextBinding","rebound","vertices","source","label","selection","publish","denseOf","vertex","tool","motion","renderable","drawn"],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sources":["../../src/core/store.ts"],"sourcesContent":["import type { MosaicClient } from \"@kanzo-tech/mosaic\";\nimport { domainOf } from \"./categories\";\nimport { bindingOf } from \"./channels\";\nimport type { Corpus, Filter, VertexTable } from \"@fossil-lang/corpus\";\nimport { filterFor, graphClient, publish } from \"./filter\";\nimport { drawnTables, loadEncoding, loadGraph, maskOf, readKept, type Encoding, type Geometry, type Kept } from \"./load\";\nimport type { Drawn, GraphOptions, GraphSnapshot, GraphStatus, GraphStore } from \"./state\";\n\nexport type { Drawn, GraphOptions, GraphSnapshot, GraphState, GraphStatus, GraphStore } from \"./state\";\n\nconst sameFilter = (a: Filter | undefined, b: Filter | undefined) =>\n JSON.stringify(a, (_, v: unknown) => (typeof v === \"bigint\" ? `${v}n` : v)) ===\n JSON.stringify(b, (_, v: unknown) => (typeof v === \"bigint\" ? `${v}n` : v));\n\nconst isPromise = (value: unknown): value is PromiseLike<Corpus> =>\n typeof (value as PromiseLike<Corpus> | null)?.then === \"function\";\n\nfunction drawnOf(geometry: Geometry, encoding: Encoding, mask: Uint8Array | null): Drawn {\n const tally = encoding.domain.map(() => 0);\n let vertices = 0;\n for (let id = 0; id < geometry.size; id++) {\n if ((mask && !mask[id]) || Number.isNaN(geometry.positions[id * 2])) continue;\n vertices++;\n const rank = encoding.ranks[id] as number;\n tally[rank] = (tally[rank] ?? 0) + 1;\n }\n return { vertices, domain: encoding.domain, tally };\n}\n\nexport function createGraph(initial: GraphOptions): GraphStore {\n let options = initial;\n const listeners = new Set<() => void>();\n const self: MosaicClient = graphClient();\n\n let corpus: Corpus | null = null;\n let opening: PromiseLike<Corpus> | null = null;\n let failed = false;\n let unrenderable = false;\n let tables: readonly VertexTable[] = [];\n let binding = bindingOf(initial);\n let filter: Filter | undefined;\n let loading: AbortController | null = null;\n let filtering: AbortController | null = null;\n let geometry: Geometry | null = null;\n let encoding: Encoding | null = null;\n let kept: Kept | null = null;\n let mask: Uint8Array | null = null;\n let uploaded: readonly unknown[] = [];\n let unlisten: (() => void) | null = null;\n let active = false;\n\n // A failure found while the store is being built is found while React is still rendering —\n // `useGraph` builds it in `useState` — and a host's `onFailure` is usually a `setState`. It is held\n // and reported to the first subscriber, which arrives in the commit phase.\n let building = true;\n let held: string | null = null;\n const fail = (error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n if (building) held = message;\n else options.onFailure(message);\n };\n\n let snapshot: GraphSnapshot = {\n status: \"none\",\n total: undefined,\n drawn: null,\n domain: [],\n selection: null,\n focus: null,\n hovered: null,\n pinned: [],\n tool: null,\n motion: \"settled\",\n progress: 1,\n options,\n corpus: null,\n binding,\n geometry: null,\n encoding: null,\n mask: null,\n };\n\n let domain: { key: unknown[]; value: readonly unknown[] } = { key: [], value: [] };\n function domainNow(): readonly unknown[] {\n const key = [tables, binding.byTable, binding.category, options.categories];\n if (key.some((part, i) => part !== domain.key[i])) domain = { key, value: domainOf(tables, binding, options.categories) };\n return domain.value;\n }\n\n let drawn: { key: unknown[]; value: Drawn | null } = { key: [], value: null };\n function drawnNow(): Drawn | null {\n const key = [geometry, encoding, mask];\n if (key.some((part, i) => part !== drawn.key[i])) {\n drawn = { key, value: geometry && encoding ? drawnOf(geometry, encoding, mask) : null };\n }\n return drawn.value;\n }\n\n function statusOf(): GraphStatus {\n if (failed || unrenderable) return \"failed\";\n if (opening) return \"opening\";\n if (!corpus) return \"none\";\n const current = [geometry, encoding, mask];\n const shown = geometry !== null && current.every((part, i) => part === uploaded[i]);\n return loading || filtering || !shown ? \"loading\" : \"idle\";\n }\n\n function notify(fields: Partial<GraphSnapshot> = {}): void {\n snapshot = {\n ...snapshot,\n total: corpus ? tables.reduce((sum, table) => sum + table.record_count, 0) : undefined,\n drawn: drawnNow(),\n domain: domainNow(),\n options,\n corpus,\n binding,\n geometry,\n encoding,\n mask,\n ...fields,\n };\n snapshot = { ...snapshot, status: statusOf() };\n emit();\n }\n\n /** A change of state only — hover, focus, selection, tool, motion — derives nothing. */\n function patch(fields: Partial<GraphSnapshot>): void {\n snapshot = { ...snapshot, ...fields };\n emit();\n }\n\n function emit(): void {\n for (const listener of listeners) listener();\n }\n\n /**\n * One read in flight per kind, and a newer ask aborts the older one's statements. A load that\n * fails leaves nothing to draw; a filter that fails leaves the last picture.\n */\n function run<T>(\n current: () => AbortController | null,\n set: (aborter: AbortController | null) => void,\n fatal: boolean,\n read: (signal: AbortSignal) => Promise<T>,\n done: (value: T) => void,\n ): void {\n current()?.abort();\n const aborter = new AbortController();\n set(aborter);\n read(aborter.signal).then(\n (value) => {\n if (current() !== aborter) return;\n set(null);\n done(value);\n notify();\n },\n (error: unknown) => {\n if (current() !== aborter) return;\n set(null);\n failed ||= fatal;\n fail(error);\n notify();\n },\n );\n }\n\n const asLoad = [() => loading, (a: AbortController | null) => (loading = a), true] as const;\n const asFilter = [() => filtering, (a: AbortController | null) => (filtering = a), false] as const;\n\n function load(): void {\n const open = corpus;\n if (!open) return;\n const seed = domainNow();\n const given = geometry;\n if (given) {\n return run(...asLoad, (signal) => loadEncoding(open, given, binding, seed, signal), (next) => {\n encoding = next;\n });\n }\n run(...asLoad, (signal) => loadGraph(open, binding, seed, signal), (next) => {\n geometry = next.geometry;\n encoding = next.encoding;\n mask = geometry && kept ? maskOf(geometry, kept) : null;\n });\n }\n\n function refilter(): void {\n filtering?.abort();\n filtering = null;\n const open = corpus;\n if (!open || tables.length === 0) return;\n if (filter === undefined) {\n kept = null;\n mask = null;\n return;\n }\n const given = filter;\n run(...asFilter, (signal) => readKept(open, tables, given, signal), (next) => {\n kept = next;\n mask = geometry ? maskOf(geometry, next) : null;\n });\n }\n\n function reopen(): void {\n loading?.abort();\n filtering?.abort();\n loading = filtering = null;\n failed = false;\n geometry = encoding = mask = kept = null;\n uploaded = [];\n tables = [];\n const cleared = { selection: null, focus: null, hovered: null, pinned: [] };\n if (!corpus) return notify(cleared);\n try {\n if (corpus.manifest.format !== \"fossil/1\") throw new Error(`the graph reads fossil/1, and this corpus is ${corpus.manifest.format}`);\n tables = drawnTables(corpus);\n if (tables.length === 0) throw new Error(\"the corpus has no vertex type with a position to draw\");\n } catch (error) {\n failed = true;\n fail(error);\n return notify(cleared);\n }\n load();\n refilter();\n notify(cleared);\n }\n\n /** A promise is adopted when it settles, and only if it is still the corpus the host means. */\n function adopt(given: GraphOptions[\"corpus\"]): void {\n corpus = null;\n opening = isPromise(given) ? given : null;\n if (!opening) {\n corpus = given as Corpus | null;\n return reopen();\n }\n const promised = opening;\n reopen();\n promised.then(\n (opened) => {\n if (opening !== promised) return;\n opening = null;\n corpus = opened;\n reopen();\n },\n (error: unknown) => {\n if (opening !== promised) return;\n opening = null;\n failed = true;\n fail(error);\n notify();\n },\n );\n }\n\n function listen(): void {\n unlisten?.();\n unlisten = null;\n const crossfilter = options.filterBy;\n const changed = () => {\n let next: Filter | undefined;\n try {\n next = crossfilter ? filterFor(crossfilter, self) : undefined;\n } catch (error) {\n fail(error);\n return;\n }\n if (sameFilter(next, filter)) return;\n filter = next;\n refilter();\n notify();\n };\n if (crossfilter) {\n crossfilter.addEventListener(\"value\", changed);\n unlisten = () => crossfilter.removeEventListener(\"value\", changed);\n }\n changed();\n }\n\n const store: GraphStore = {\n /**\n * The first subscriber starts listening to the crossfilter and the last one stops it and lets the\n * graph go — `QueryObserver`'s `onSubscribe`/`onUnsubscribe`, which is what survives StrictMode\n * mounting everything twice.\n */\n subscribe(listener) {\n listeners.add(listener);\n if (!active) {\n active = true;\n listen();\n if (held !== null) {\n const message = held;\n held = null;\n options.onFailure(message);\n }\n }\n return () => {\n listeners.delete(listener);\n if (listeners.size === 0) store.destroy();\n };\n },\n getSnapshot: () => snapshot,\n getOptions: () => options,\n setOptions(next) {\n const previous = options;\n options = next;\n const nextBinding = bindingOf(next);\n const rebound =\n nextBinding.category !== binding.category ||\n nextBinding.byTable !== binding.byTable ||\n nextBinding.size !== binding.size ||\n next.categories !== previous.categories;\n binding = nextBinding;\n if (next.corpus !== previous.corpus) {\n adopt(next.corpus);\n if (active && next.filterBy !== previous.filterBy) listen();\n return;\n }\n if (active && next.filterBy !== previous.filterBy) listen();\n if (rebound) load();\n notify();\n },\n destroy() {\n active = false;\n unlisten?.();\n unlisten = null;\n loading?.abort();\n filtering?.abort();\n listeners.clear();\n },\n select(vertices, source = \"node\", label = \"\") {\n const selection = vertices && vertices.length > 0 ? { vertices: [...vertices], source, label } : null;\n patch({ selection });\n options.onSelect?.(selection);\n const key = tables[0]?.key;\n if (options.filterBy && key) publish(options.filterBy, self, key, selection ? selection.vertices : null);\n },\n focus(vertex) {\n if (vertex === snapshot.focus) return;\n patch({ focus: vertex });\n options.onFocus?.(vertex);\n },\n hover(vertex) {\n if (vertex !== snapshot.hovered) patch({ hovered: vertex });\n },\n pin(vertices) {\n patch({ pinned: [...vertices] });\n },\n setTool(tool) {\n if (tool !== snapshot.tool) patch({ tool });\n },\n report(motion) {\n if (motion !== snapshot.motion) patch({ motion });\n },\n reportProgress(value) {\n if (value !== snapshot.progress) patch({ progress: value });\n },\n setRenderable(renderable) {\n if (unrenderable === !renderable) return;\n unrenderable = !renderable;\n notify();\n },\n reportDrawn(drawnSnapshot) {\n const next = [drawnSnapshot.geometry, drawnSnapshot.encoding, drawnSnapshot.mask];\n if (next.every((part, i) => part === uploaded[i])) return;\n uploaded = next;\n notify();\n },\n };\n\n adopt(initial.corpus);\n building = false;\n return store;\n}\n"],"names":["sameFilter","b","_","v","isPromise","value","drawnOf","geometry","encoding","mask","tally","vertices","id","rank","createGraph","initial","options","listeners","self","graphClient","corpus","opening","failed","unrenderable","tables","binding","bindingOf","filter","loading","filtering","kept","uploaded","unlisten","active","building","held","fail","error","message","snapshot","domain","domainNow","key","part","i","domainOf","drawn","drawnNow","statusOf","shown","notify","fields","sum","table","emit","patch","listener","run","current","set","fatal","read","done","_a","aborter","asLoad","a","asFilter","load","open","seed","given","signal","loadEncoding","next","loadGraph","maskOf","refilter","readKept","reopen","cleared","drawnTables","adopt","promised","opened","listen","crossfilter","changed","filterFor","store","previous","nextBinding","rebound","source","label","selection","_b","publish","vertex","tool","motion","renderable","drawnSnapshot"],"mappings":"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"}
@@ -1,5 +1,24 @@
1
- import { Box } from '@fossil-lang/corpus';
2
- import { VertexId } from './resident';
1
+ /**
2
+ * The vocabulary a graph view is described in — what to draw, how hard the forces pull, what is
3
+ * selected and what the layout is doing.
4
+ *
5
+ * These lived beside a React context in the workspace showcase, which made them look like that
6
+ * app's state. They are not: `Selection` is the shape every panel hands the canvas, and the rest is
7
+ * what a canvas is doing. The provider that holds them is an arrangement and stays where
8
+ * arrangements live; the shapes themselves belong to the renderer.
9
+ *
10
+ * **`Display` and `Sim` have left this file**, and in opposite directions. `Display` was a second
11
+ * vocabulary for the picture — two multipliers over numbers `lookFrom` already computes, plus three
12
+ * toggles — so what survived of it is `link.render` and `grid` on the `Look`. `Sim` went to
13
+ * `graph-sim.ts` with a builder of its own, because it is what `graph-looks.ts` is for forces: a
14
+ * type, one function that reads the declared values, and a default that is the function called with
15
+ * nothing.
16
+ */
17
+ /**
18
+ * A vertex: its `dense_id`, which fossil numbers `0 … V − 1` across every vertex table of the corpus.
19
+ * The drawn types take the first ids, so a drawn vertex's id is also its index in cosmos.gl's buffers.
20
+ */
21
+ export type VertexId = number;
3
22
  /**
4
23
  * The selection tools, and the gesture that reaches them without a mode.
5
24
  *
@@ -28,13 +47,6 @@ export type SelectionSource = "marquee" | "lasso" | "node" | "order" | "ask";
28
47
  * points at part of it.
29
48
  */
30
49
  export interface Selection {
31
- /**
32
- * Identities, never buffer indices.
33
- *
34
- * A selection is the one thing on this canvas guaranteed to outlive the answer that made it: a
35
- * reader selects, pans, and expects to come back to it. An index would have been reused by then,
36
- * and by a different vertex.
37
- */
38
50
  vertices: VertexId[];
39
51
  source: SelectionSource;
40
52
  /** What the corner calls it. */
@@ -53,14 +65,6 @@ export interface GraphCommands {
53
65
  reveal(vertex: VertexId): void;
54
66
  /** Frame whatever the canvas currently has selected. */
55
67
  frameSelection(): void;
56
- /**
57
- * Frame a box in the corpus's coordinates — a tile's `bbox`, the extent, a window a host chose.
58
- * The camera's only door: nothing outside the package reaches the renderer to move it.
59
- */
60
- frameBox(box: Box, options?: {
61
- duration?: number;
62
- padding?: number;
63
- }): void;
64
68
  clear(): void;
65
69
  }
66
70
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C;;;;;;GAMG;AACH,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAE3C,mEAAmE;AACnE,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEtD;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AAE7E;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,SAAS;IACxB;;;;;;OAMG;IACH,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,MAAM,EAAE,eAAe,CAAC;IACxB,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,yFAAyF;AACzF,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,GAAG,IAAI,IAAI,CAAC;IACZ,KAAK,IAAI,IAAI,CAAC;IACd,MAAM,IAAI,IAAI,CAAC;IACf,OAAO,IAAI,IAAI,CAAC;IAChB,iFAAiF;IACjF,KAAK,IAAI,IAAI,CAAC;IACd,oCAAoC;IACpC,MAAM,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC/B,wDAAwD;IACxD,cAAc,IAAI,IAAI,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5E,KAAK,IAAI,IAAI,CAAC;CACf"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE9B;;;;;;GAMG;AACH,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAE3C,mEAAmE;AACnE,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEtD;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AAE7E;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,MAAM,EAAE,eAAe,CAAC;IACxB,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,yFAAyF;AACzF,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,GAAG,IAAI,IAAI,CAAC;IACZ,KAAK,IAAI,IAAI,CAAC;IACd,MAAM,IAAI,IAAI,CAAC;IACf,OAAO,IAAI,IAAI,CAAC;IAChB,iFAAiF;IACjF,KAAK,IAAI,IAAI,CAAC;IACd,oCAAoC;IACpC,MAAM,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC/B,wDAAwD;IACxD,cAAc,IAAI,IAAI,CAAC;IACvB,KAAK,IAAI,IAAI,CAAC;CACf"}
package/dist/index.d.ts CHANGED
@@ -1,14 +1,14 @@
1
1
  /**
2
2
  * The graph view over a fossil corpus. fossil reads and this package draws, and nothing crosses
3
3
  * between them but the corpus contract: the host opens the corpus with fossil's `open` on the page's
4
- * `engine()`, and `GraphRoot` draws it.
4
+ * `engine()`, and `GraphRoot` draws the whole of it.
5
5
  *
6
6
  * Four layers, each the shape of a named reference — `/docs/design/graph`:
7
7
  *
8
- * - `core/` — a headless tileset in deck.gl's `Tileset2D` shape over `tileMatrix` and `scan`, and a
8
+ * - `core/` — the loader, one `scan` per table read whole into arrays indexed by `dense_id`, and a
9
9
  * store in TanStack Query's observer shape. No React, no cosmos.gl, no SQL.
10
- * - `render/` — tiles to cosmos.gl buffers: encoded once per tile, uploaded by kind, rendered once a
11
- * frame.
10
+ * - `render/` — those arrays to cosmos.gl: uploaded once per corpus, repainted by kind, rendered once
11
+ * a frame.
12
12
  * - `react/` — `useGraph`, `GraphRoot`, `GraphRootProvider`, `useGraphContext`: Ark's four; and
13
13
  * `useGraphState`, TanStack Store's selector, because the api is commands and the state moves at
14
14
  * frame rate.
@@ -30,11 +30,9 @@ export { GraphInspector, type GraphInspectorProps } from './parts/graph-inspecto
30
30
  export { ShapeGlyph, type ShapeGlyphProps } from './parts/shape-glyph';
31
31
  export { lookFrom, type Look, type LookPatch, type Shape } from './render/graph-looks';
32
32
  export { simFrom, type Sim } from './render/graph-sim';
33
- export { adaptive } from './render/adaptive';
34
33
  export { scaleOf } from './render/graph-model';
35
34
  export type { Channels } from './core/channels';
36
- export { vertexId, typeOf, denseOf, type Resident, type VertexId } from './core/resident';
37
- export type { GraphCommands, Motion, Selection, SelectionSource, Tool } from './core/types';
35
+ export type { GraphCommands, Motion, Selection, SelectionSource, Tool, VertexId } from './core/types';
38
36
  export type { Drawn, GraphState, GraphStatus } from './core/state';
39
37
  export type { VertexDetail } from './core/detail';
40
38
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,sBAAsB,GAC5B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAIvE,OAAO,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,KAAK,SAAS,EAAE,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AACvF,OAAO,EAAE,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAIhD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE1F,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAC5F,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACnE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,sBAAsB,GAC5B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAIvE,OAAO,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,KAAK,SAAS,EAAE,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AACvF,OAAO,EAAE,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACtG,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACnE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}