@kanzo-tech/graph 0.13.0 → 0.14.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.
@@ -33,7 +33,10 @@ export interface GraphOptions extends Channels {
33
33
  look?: LookPatch;
34
34
  /** The force coefficients, as a patch over this package's own. */
35
35
  sim?: Partial<Sim>;
36
- /** A live layout. Off: a corpus's positions are the index every read is asked against. */
36
+ /**
37
+ * Runs the live layout while true, from the points' current positions. Off by default: the corpus's
38
+ * positions are drawn as they are. `GraphToolbar` starts and stops the layout whatever this says.
39
+ */
37
40
  simulate?: boolean;
38
41
  /** Required: unhandled, a browser with no WebGL context shows an empty box. */
39
42
  onFailure: (message: string) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/core/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,KAAK,EAAE,SAAS,IAAI,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAExE,MAAM,WAAW,YAAa,SAAQ,QAAQ;IAC5C;;;OAGG;IACH,MAAM,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAC5C,yEAAyE;IACzE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9C,2GAA2G;IAC3G,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8FAA8F;IAC9F,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,kEAAkE;IAClE,GAAG,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACnB,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+EAA+E;IAC/E,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,KAAK,IAAI,CAAC;IACjD,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC;CAC7C;AAED;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE7E,0DAA0D;AAC1D,MAAM,WAAW,KAAK;IACpB,yCAAyC;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,iEAAiE;IACjE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,0GAA0G;IAC1G,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC;IACpC,oDAAoD;IACpD,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,+DAA+D;AAC/D,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,wFAAwF;IACxF,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,6DAA6D;IAC7D,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,kDAAkD;IAClD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,qEAAqE;IACrE,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B,qGAAqG;IACrG,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,CAAC;IACrC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,0DAA0D;IAC1D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,qEAAqE;IACrE,QAAQ,CAAC,QAAQ,EAAE,SAAS,GAAG,EAAE,CAAC;IAClC,6DAA6D;IAC7D,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,uEAAuE;AACvE,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;CAC/B;AAED,oDAAoD;AACpD,MAAM,WAAW,aAAc,SAAQ,UAAU;IAC/C,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IACtC,4FAA4F;IAC5F,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,kGAAkG;IAClG,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,6DAA6D;IAC7D,QAAQ,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,CAAC;IACtC,iEAAiE;IACjE,QAAQ,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,CAAC;CACtC;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAC5C,WAAW,IAAI,aAAa,CAAC;IAC7B,UAAU,IAAI,YAAY,CAAC;IAC3B,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IACxC,OAAO,IAAI,IAAI,CAAC;IAChB,4DAA4D;IAC5D,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtC,MAAM,CAAC,QAAQ,EAAE,SAAS,QAAQ,EAAE,GAAG,IAAI,EAAE,MAAM,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7F,KAAK,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;IACrC,KAAK,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;IACrC,GAAG,CAAC,QAAQ,EAAE,SAAS,QAAQ,EAAE,GAAG,IAAI,CAAC;IACzC,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,yFAAyF;IACzF,aAAa,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI,CAAC;IACzC,sGAAsG;IACtG,WAAW,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC;CACtE"}
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/core/state.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/core/store.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,YAAY,EAA8B,UAAU,EAAY,MAAM,SAAS,CAAC;AAK9F,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEjH,0FAA0F;AAC1F,eAAO,MAAM,aAAa,QAAS,CAAC;AAwBpC,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,UAAU,CA2U7D"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/core/store.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,YAAY,EAA8B,UAAU,EAAY,MAAM,SAAS,CAAC;AAK9F,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEjH,0FAA0F;AAC1F,eAAO,MAAM,aAAa,QAAS,CAAC;AAwBpC,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,UAAU,CAoV7D"}
@@ -1,59 +1,59 @@
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 G, 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 Y = 2e4, Q = G({}), W = le[0];
8
- function ae(i) {
9
- var m;
1
+ import { PAYLOAD_ADDRESS as re, PAYLOAD_COORDINATES as ie } from "@fossil-lang/corpus";
2
+ import { domainOf as se } from "./categories.js";
3
+ import { bindingOf as G, projectionOf as ce } from "./channels.js";
4
+ import { graphClient as fe, publish as ue, filterFor as de } from "./filter.js";
5
+ import { denseOf as ae } from "./resident.js";
6
+ import { Tileset2D as pe } from "./tileset.js";
7
+ const Y = 2e4, W = G({}), X = re[0];
8
+ function me(s) {
9
+ var d;
10
10
  let n = 0;
11
- for (const s of i.edges) n += s.src.byteLength + s.dst.byteLength + (((m = s.weight) == null ? void 0 : m.byteLength) ?? 0);
12
- return n + i.rows.numRows * 8 * 4;
11
+ for (const c of s.edges) n += c.src.byteLength + c.dst.byteLength + (((d = c.weight) == null ? void 0 : d.byteLength) ?? 0);
12
+ return n + s.rows.numRows * 8 * 4;
13
13
  }
14
- const pe = (i, n) => JSON.stringify(i, (m, s) => typeof s == "bigint" ? `${s}n` : s) === JSON.stringify(n, (m, s) => typeof s == "bigint" ? `${s}n` : s), me = (i) => typeof (i == null ? void 0 : i.then) == "function";
15
- function X(i, n) {
16
- return i.length !== n.length ? n : n.every((m, s) => {
17
- var o;
18
- return m.content === ((o = i[s]) == null ? void 0 : o.content);
19
- }) ? i : n;
14
+ const ye = (s, n) => JSON.stringify(s, (d, c) => typeof c == "bigint" ? `${c}n` : c) === JSON.stringify(n, (d, c) => typeof c == "bigint" ? `${c}n` : c), ge = (s) => typeof (s == null ? void 0 : s.then) == "function";
15
+ function Z(s, n) {
16
+ return s.length !== n.length ? n : n.every((d, c) => {
17
+ var r;
18
+ return d.content === ((r = s[c]) == null ? void 0 : r.content);
19
+ }) ? s : n;
20
20
  }
21
- function ve(i) {
22
- let n = i;
23
- const m = /* @__PURE__ */ new Set(), s = se();
24
- let o = null, b = null, M = !1, C = !1, d = null, T = 0, J = null, O = null, g = Q, P, z = null, E = [], S = null, h = null, B = !1, V = -1, $ = !0, A = null;
25
- const D = (e) => {
21
+ function Te(s) {
22
+ let n = s;
23
+ const d = /* @__PURE__ */ new Set(), c = fe();
24
+ let r = null, h = null, S = !1, P = !1, f = null, A = 0, J = null, v = null, m = W, _, E = null, B = [], I = null, y = null, D = !1, V = -1, $ = !0, N = null;
25
+ const M = (e) => {
26
26
  const t = e instanceof Error ? e.message : String(e);
27
- $ ? A = t : n.onFailure(t);
28
- }, a = new de({
27
+ $ ? N = t : n.onFailure(t);
28
+ }, u = new pe({
29
29
  debounceTime: 60,
30
30
  load: async (e, t) => {
31
- if (!o || !O) throw new Error("the graph has no scan to read with");
32
- const l = (u) => {
33
- var w;
34
- return ((w = d == null ? void 0 : d.tileMatrices[u.z]) == null ? void 0 : w.kind) === "cells";
35
- }, r = await O.read(e, { signal: t }), y = await o.edges({ from: e, direction: "src", signal: t }), p = e.filter((u) => !l(u)), N = p.length > 0 ? await o.edges({ from: p, direction: "dst", signal: t }) : [], F = new Map(p.map((u, w) => [u, N[w]]));
36
- return e.map((u, w) => {
37
- const v = y[w], L = F.get(u), ee = [...(v == null ? void 0 : v.batches) ?? [], ...(L == null ? void 0 : L.batches) ?? []], q = [...(v == null ? void 0 : v.declined) ?? [], ...(L == null ? void 0 : L.declined) ?? []], te = l(u) ? q.filter((ne) => ne.direction !== "dst") : q, H = { rows: r[w], edges: ee, declined: te };
38
- return { ...H, byteLength: ae(H) };
31
+ if (!r || !v) throw new Error("the graph has no scan to read with");
32
+ const l = (w) => {
33
+ var L;
34
+ return ((L = f == null ? void 0 : f.tileMatrices[w.z]) == null ? void 0 : L.kind) === "cells";
35
+ }, o = await v.read(e, { signal: t }), p = await r.edges({ from: e, direction: "src", signal: t }), a = e.filter((w) => !l(w)), O = a.length > 0 ? await r.edges({ from: a, direction: "dst", signal: t }) : [], te = new Map(a.map((w, L) => [w, O[L]]));
36
+ return e.map((w, L) => {
37
+ const T = p[L], z = te.get(w), ne = [...(T == null ? void 0 : T.batches) ?? [], ...(z == null ? void 0 : z.batches) ?? []], H = [...(T == null ? void 0 : T.declined) ?? [], ...(z == null ? void 0 : z.declined) ?? []], le = l(w) ? H.filter((oe) => oe.direction !== "dst") : H, Q = { rows: o[L], edges: ne, declined: le };
38
+ return { ...Q, byteLength: me(Q) };
39
39
  });
40
40
  },
41
41
  onTileLoad: (e) => {
42
42
  var t;
43
43
  for (const l of ((t = e.content) == null ? void 0 : t.declined) ?? [])
44
- E.some((r) => r.edgeType === l.edgeType && r.direction === l.direction) || (E = [...E, l]);
45
- a.refresh(), f();
44
+ B.some((o) => o.edgeType === l.edgeType && o.direction === l.direction) || (B = [...B, l]);
45
+ u.refresh(), g();
46
46
  },
47
47
  onTileError: (e) => {
48
- a.refresh(), D(e), f();
48
+ u.refresh(), M(e), g();
49
49
  }
50
50
  });
51
- let c = {
51
+ let i = {
52
52
  status: "none",
53
53
  matrix: null,
54
54
  typeIndex: 0,
55
55
  modeColumn: null,
56
- binding: Q,
56
+ binding: W,
57
57
  domain: [],
58
58
  z: null,
59
59
  visible: [],
@@ -76,165 +76,168 @@ function ve(i) {
76
76
  var t;
77
77
  return {
78
78
  address: e.address,
79
- kind: ((t = d == null ? void 0 : d.tileMatrices[e.address.z]) == null ? void 0 : t.kind) ?? "rows",
79
+ kind: ((t = f == null ? void 0 : f.tileMatrices[e.address.z]) == null ? void 0 : t.kind) ?? "rows",
80
80
  content: e.content
81
81
  };
82
82
  };
83
- let _ = { key: [], value: [] };
84
- function Z() {
85
- const e = [o, T, g.category, n.categories];
86
- return e.some((t, l) => t !== _.key[l]) && (_ = { key: e, value: re(o, T, g, n.categories) }), _.value;
83
+ let C = { key: [], value: [] };
84
+ function x() {
85
+ const e = [r, A, m.category, n.categories];
86
+ return e.some((t, l) => t !== C.key[l]) && (C = { key: e, value: se(r, A, m, n.categories) }), C.value;
87
87
  }
88
- function x(e, t) {
89
- return M || C ? "failed" : b ? "opening" : o ? e || S !== t || c.drawn === null ? "reading" : "idle" : "none";
88
+ function ee(e, t) {
89
+ return S || P ? "failed" : h ? "opening" : r ? e || I !== t || i.drawn === null ? "reading" : "idle" : "none";
90
90
  }
91
- function f(e = {}) {
92
- var y;
93
- V = a.frame;
94
- const t = a.tiles.filter((p) => p.content !== null), l = X(c.visible, t.filter((p) => p.isVisible).map(j)), r = a.selectedTiles.some((p) => p.isLoading);
95
- c = {
96
- ...c,
97
- matrix: d,
98
- typeIndex: T,
91
+ function g(e = {}) {
92
+ var p;
93
+ V = u.frame;
94
+ const t = u.tiles.filter((a) => a.content !== null), l = Z(i.visible, t.filter((a) => a.isVisible).map(j)), o = u.selectedTiles.some((a) => a.isLoading);
95
+ i = {
96
+ ...i,
97
+ matrix: f,
98
+ typeIndex: A,
99
99
  modeColumn: J,
100
- binding: g,
101
- domain: Z(),
102
- z: a.z,
100
+ binding: m,
101
+ domain: x(),
102
+ z: u.z,
103
103
  visible: l,
104
- cached: X(c.cached, t.map(j)),
105
- pending: r,
106
- total: d ? Number(((y = d.tileMatrices[d.tileMatrices.length - 1]) == null ? void 0 : y.count) ?? 0) : void 0,
107
- declined: E,
104
+ cached: Z(i.cached, t.map(j)),
105
+ pending: o,
106
+ total: f ? Number(((p = f.tileMatrices[f.tileMatrices.length - 1]) == null ? void 0 : p.count) ?? 0) : void 0,
107
+ declined: B,
108
108
  options: n,
109
- corpus: o,
109
+ corpus: r,
110
110
  ...e
111
- }, c = { ...c, status: x(r, c.visible) };
112
- for (const p of m) p();
111
+ }, i = { ...i, status: ee(o, i.visible) }, K();
112
+ }
113
+ function b(e) {
114
+ i = { ...i, ...e }, K();
115
+ }
116
+ function K() {
117
+ for (const e of d) e();
113
118
  }
114
119
  function k() {
115
- if (!(!o || !d)) {
120
+ if (!(!r || !f)) {
116
121
  try {
117
- const e = [W, ...oe];
118
- O = o.scan({ type: d.type, filter: P, select: ie(g, e) }), a.setPlan(O.plan());
122
+ const e = [X, ...ie];
123
+ v = r.scan({ type: f.type, filter: _, select: ce(m, e) }), u.setPlan(v.plan());
119
124
  } catch (e) {
120
- O = null, a.setPlan([]), D(e);
125
+ v = null, u.setPlan([]), M(e);
121
126
  }
122
- a.reloadAll(), z && a.update(z, n.limit ?? Y), f();
127
+ u.reloadAll(), E && u.update(E, n.limit ?? Y), g();
123
128
  }
124
129
  }
125
- function I() {
126
- var r, y, p, N, F;
127
- M = !1, d = null, O = null, E = [], S = null, a.finalize();
130
+ function F() {
131
+ var o, p, a;
132
+ S = !1, f = null, v = null, B = [], I = null, u.finalize();
128
133
  const e = { selection: null, focus: null, hovered: null, pinned: [], drawn: null };
129
- if (!o) return f(e);
130
- const t = o.types.vertices, l = n.type ?? ((r = t.find((u) => u.geometry)) == null ? void 0 : r.type) ?? ((y = t[0]) == null ? void 0 : y.type);
131
- T = Math.max(0, t.findIndex((u) => u.type === l));
134
+ if (!r) return g(e);
135
+ const t = r.types.vertices, l = n.type ?? ((o = t.find((O) => O.geometry)) == null ? void 0 : o.type) ?? ((p = t[0]) == null ? void 0 : p.type);
136
+ A = Math.max(0, t.findIndex((O) => O.type === l));
132
137
  try {
133
138
  if (l === void 0) throw new Error("the corpus has no vertex type to draw");
134
- d = o.tileMatrix(l);
135
- const u = ((p = o.addressing.vertexType(l).cells) == null ? void 0 : p.modeChannel) ?? null;
136
- J = ((F = (N = t[T]) == null ? void 0 : N.channels.find((w) => w.name === u)) == null ? void 0 : F.column) ?? null, a.setMatrix(d);
137
- } catch (u) {
138
- M = !0, D(u);
139
+ f = r.tileMatrix(l), J = ((a = f.mode) == null ? void 0 : a.column) ?? null, u.setMatrix(f);
140
+ } catch (O) {
141
+ S = !0, M(O);
139
142
  }
140
- c = { ...c, ...e }, k();
143
+ i = { ...i, ...e }, k();
141
144
  }
142
- function K(e) {
143
- if (o = null, b = me(e) ? e : null, !b)
144
- return o = e, I();
145
- const t = b;
146
- I(), t.then(
145
+ function U(e) {
146
+ if (r = null, h = ge(e) ? e : null, !h)
147
+ return r = e, F();
148
+ const t = h;
149
+ F(), t.then(
147
150
  (l) => {
148
- b === t && (b = null, o = l, I());
151
+ h === t && (h = null, r = l, F());
149
152
  },
150
153
  (l) => {
151
- b === t && (b = null, M = !0, D(l), f());
154
+ h === t && (h = null, S = !0, M(l), g());
152
155
  }
153
156
  );
154
157
  }
155
158
  function R() {
156
- h == null || h(), h = null;
159
+ y == null || y(), y = null;
157
160
  const e = n.filterBy, t = () => {
158
161
  let l;
159
162
  try {
160
- l = e ? fe(e, s) : void 0;
161
- } catch (r) {
162
- D(r);
163
+ l = e ? de(e, c) : void 0;
164
+ } catch (o) {
165
+ M(o);
163
166
  return;
164
167
  }
165
- pe(l, P) || (P = l, k());
168
+ ye(l, _) || (_ = l, k());
166
169
  };
167
- e && (e.addEventListener("value", t), h = () => e.removeEventListener("value", t)), t();
170
+ e && (e.addEventListener("value", t), y = () => e.removeEventListener("value", t)), t();
168
171
  }
169
- const U = {
172
+ const q = {
170
173
  /**
171
174
  * The first subscriber starts listening to the crossfilter and the last one stops it and lets the
172
175
  * tiles go — `QueryObserver`'s `onSubscribe`/`onUnsubscribe`, which is what survives StrictMode
173
176
  * mounting everything twice.
174
177
  */
175
178
  subscribe(e) {
176
- if (m.add(e), !B && (B = !0, R(), A !== null)) {
177
- const t = A;
178
- A = null, n.onFailure(t);
179
+ if (d.add(e), !D && (D = !0, R(), N !== null)) {
180
+ const t = N;
181
+ N = null, n.onFailure(t);
179
182
  }
180
183
  return () => {
181
- m.delete(e), m.size === 0 && U.destroy();
184
+ d.delete(e), d.size === 0 && q.destroy();
182
185
  };
183
186
  },
184
- getSnapshot: () => c,
187
+ getSnapshot: () => i,
185
188
  getOptions: () => n,
186
189
  setOptions(e) {
187
190
  const t = n;
188
191
  n = e;
189
- const l = G(e), r = l.category !== g.category || l.size !== g.size || l.title !== g.title;
190
- if (g = l, e.corpus !== t.corpus || e.type !== t.type) {
191
- e.corpus !== t.corpus ? K(e.corpus) : I(), B && e.filterBy !== t.filterBy && R();
192
+ const l = G(e), o = l.category !== m.category || l.size !== m.size || l.title !== m.title;
193
+ if (m = l, e.corpus !== t.corpus || e.type !== t.type) {
194
+ e.corpus !== t.corpus ? U(e.corpus) : F(), D && e.filterBy !== t.filterBy && R();
192
195
  return;
193
196
  }
194
- if (B && e.filterBy !== t.filterBy && R(), r) return k();
195
- e.limit !== t.limit && z && a.update(z, e.limit ?? Y), f();
197
+ if (D && e.filterBy !== t.filterBy && R(), o) return k();
198
+ e.limit !== t.limit && E && u.update(E, e.limit ?? Y), g();
196
199
  },
197
200
  destroy() {
198
- B = !1, h == null || h(), h = null, a.finalize(), m.clear();
201
+ D = !1, y == null || y(), y = null, u.finalize(), d.clear();
199
202
  },
200
203
  setViewport(e) {
201
- z = e, a.update(e, n.limit ?? Y) !== V && f();
204
+ E = e, u.update(e, n.limit ?? Y) !== V && g();
202
205
  },
203
206
  select(e, t = "node", l = "") {
204
- var y;
205
- const r = e && e.length > 0 ? { vertices: [...e], source: t, label: l } : null;
206
- f({ selection: r }), (y = n.onSelect) == null || y.call(n, r), n.filterBy && ce(n.filterBy, s, W, r ? r.vertices.map(ue) : null);
207
+ var p;
208
+ const o = e && e.length > 0 ? { vertices: [...e], source: t, label: l } : null;
209
+ b({ selection: o }), (p = n.onSelect) == null || p.call(n, o), n.filterBy && ue(n.filterBy, c, X, o ? o.vertices.map(ae) : null);
207
210
  },
208
211
  focus(e) {
209
212
  var t;
210
- e !== c.focus && (f({ focus: e }), (t = n.onFocus) == null || t.call(n, e));
213
+ e !== i.focus && (b({ focus: e }), (t = n.onFocus) == null || t.call(n, e));
211
214
  },
212
215
  hover(e) {
213
- e !== c.hovered && f({ hovered: e });
216
+ e !== i.hovered && b({ hovered: e });
214
217
  },
215
218
  pin(e) {
216
- f({ pinned: [...e] });
219
+ b({ pinned: [...e] });
217
220
  },
218
221
  setTool(e) {
219
- e !== c.tool && f({ tool: e });
222
+ e !== i.tool && b({ tool: e });
220
223
  },
221
224
  report(e) {
222
- e !== c.motion && f({ motion: e });
225
+ e !== i.motion && b({ motion: e });
223
226
  },
224
227
  reportProgress(e) {
225
- e !== c.progress && f({ progress: e });
228
+ e !== i.progress && b({ progress: e });
226
229
  },
227
230
  setRenderable(e) {
228
- C !== !e && (C = !e, f());
231
+ P !== !e && (P = !e, g());
229
232
  },
230
233
  reportDrawn(e, t) {
231
- S === e && t === null || (S = e, f(t ? { drawn: t } : {}));
234
+ I === e && t === null || (I = e, g(t ? { drawn: t } : {}));
232
235
  }
233
236
  };
234
- return g = G(i), K(i.corpus), $ = !1, U;
237
+ return m = G(s), U(s.corpus), $ = !1, q;
235
238
  }
236
239
  export {
237
240
  Y as DEFAULT_LIMIT,
238
- ve as createGraph
241
+ Te as createGraph
239
242
  };
240
243
  //# 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 const mode = corpus.addressing.vertexType(type).cells?.modeChannel ?? null;\n modeColumn = types[typeIndex]?.channels.find((channel) => channel.name === 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","mode","_c","_e","_d","channel","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 {\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(fields: 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 ...fields,\n };\n snapshot = { ...snapshot, status: statusOf(pending, snapshot.visible) };\n emit();\n }\n\n /** A change of state only — hover, focus, selection, tool, motion — rebuilds no tile view. */\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 /** 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 patch({ 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 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(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","fields","tiles","emit","patch","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 +1 @@
1
- {"version":3,"file":"gesture.d.ts","sourceRoot":"","sources":["../../src/parts/gesture.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAGtE;;;;;;;;;;GAUG;AACH,MAAM,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAErC,wFAAwF;AACxF,MAAM,MAAM,IAAI,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,KAAK,CAAC;IAAC,EAAE,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,KAAK,EAAE,CAAA;CAAE,CAAC;AAS/F,4FAA4F;AAC5F,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC,aAAa,CAIjE;AAED,MAAM,WAAW,qBAAqB;IACpC,0DAA0D;IAC1D,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,oFAAoF;IACpF,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,mFAAmF;IACnF,MAAM,EAAE,IAAI,CAAC;IACb,QAAQ,EAAE;QACR,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC;QACnD,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC;QACnD,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC;QACjD,eAAe,EAAE,MAAM,IAAI,CAAC;KAC7B,CAAC;CACH;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,KAAK,GAAG,IAAI,CAAC;IAC7B;;;;;;OAMG;IACH,WAAW,EAAE,MAAM,QAAQ,CAAC;IAC5B,wEAAwE;IACxE,YAAY,EAAE,MAAM,SAAS,GAAG,IAAI,CAAC;IACrC,MAAM,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzF,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;CAC/B;AAOD,wBAAgB,UAAU,CAAC,OAAO,EAAE,qBAAqB,GAAG,qBAAqB,CA6IhF"}
1
+ {"version":3,"file":"gesture.d.ts","sourceRoot":"","sources":["../../src/parts/gesture.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEtE;;;;;;;;;;GAUG;AACH,MAAM,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAErC,wFAAwF;AACxF,MAAM,MAAM,IAAI,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,KAAK,CAAC;IAAC,EAAE,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,KAAK,EAAE,CAAA;CAAE,CAAC;AAS/F,4FAA4F;AAC5F,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC,aAAa,CAIjE;AAED,MAAM,WAAW,qBAAqB;IACpC,0DAA0D;IAC1D,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,oFAAoF;IACpF,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,mFAAmF;IACnF,MAAM,EAAE,IAAI,CAAC;IACb,QAAQ,EAAE;QACR,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC;QACnD,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC;QACnD,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC;QACjD,eAAe,EAAE,MAAM,IAAI,CAAC;KAC7B,CAAC;CACH;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,KAAK,GAAG,IAAI,CAAC;IAC7B;;;;;;OAMG;IACH,WAAW,EAAE,MAAM,QAAQ,CAAC;IAC5B,wEAAwE;IACxE,YAAY,EAAE,MAAM,SAAS,GAAG,IAAI,CAAC;IACrC,MAAM,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzF,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;CAC/B;AAOD,wBAAgB,UAAU,CAAC,OAAO,EAAE,qBAAqB,GAAG,qBAAqB,CA0IhF"}
@@ -1,22 +1,20 @@
1
1
  "use client";
2
- import { useState as m, useRef as C, useCallback as S, useEffect as I } from "react";
3
- import { isReady as K } from "../render/when-ready.js";
4
- const x = 3, _ = 4, q = 60;
5
- function N(l) {
2
+ import { useState as m, useRef as R, useCallback as S, useEffect as I } from "react";
3
+ const x = 3, K = 4, _ = 60;
4
+ function D(l) {
6
5
  if (!l) return { display: "none" };
7
6
  const [i = 0, a = 0] = l.tool === "rect" ? l.to : l.path[l.path.length - 1] ?? [];
8
7
  return { left: i + 14, top: a + 14 };
9
8
  }
10
- const z = {
9
+ const q = {
11
10
  rect: { source: "marquee", label: "Marquee" },
12
11
  lasso: { source: "lasso", label: "Lasso" }
13
12
  };
14
- function U(l) {
15
- const { commit: i, getGraph: a, getResident: k, getSelection: v, setTool: y, tool: h } = l, [s, c] = m(null), [L, f] = m(null), [R, d] = m(!1), b = C(0), p = S(
13
+ function G(l) {
14
+ const { commit: i, getGraph: a, getResident: k, getSelection: v, setTool: y, tool: h } = l, [s, c] = m(null), [L, f] = m(null), [T, d] = m(!1), b = R(0), p = S(
16
15
  (t) => {
17
16
  const e = a();
18
17
  if (!e) return [];
19
- if (!K(e)) return [];
20
18
  if (t.tool === "rect") {
21
19
  const [[o, n], [r, u]] = [t.from, t.to];
22
20
  return Math.abs(r - o) < x || Math.abs(u - n) < x ? [] : Array.from(
@@ -32,7 +30,7 @@ function U(l) {
32
30
  ), E = S(
33
31
  (t) => {
34
32
  const e = performance.now();
35
- e - b.current < q || (b.current = e, f(p(t).length));
33
+ e - b.current < _ || (b.current = e, f(p(t).length));
36
34
  },
37
35
  [p]
38
36
  );
@@ -49,18 +47,18 @@ function U(l) {
49
47
  const M = (t) => {
50
48
  const e = t.currentTarget.getBoundingClientRect();
51
49
  return [t.clientX - e.left, t.clientY - e.top];
52
- }, T = (t, e) => {
50
+ }, A = (t, e) => {
53
51
  var P;
54
52
  if (c(null), f(null), !t) return;
55
53
  const o = new Set(k().verticesAt(p(t)));
56
54
  if (o.size === 0 && !e.altKey) return;
57
- const { label: n, source: r } = z[t.tool], u = ((P = v()) == null ? void 0 : P.vertices) ?? [];
55
+ const { label: n, source: r } = q[t.tool], u = ((P = v()) == null ? void 0 : P.vertices) ?? [];
58
56
  if (e.altKey) {
59
57
  const w = new Set(u);
60
- for (const A of o) w.delete(A);
58
+ for (const C of o) w.delete(C);
61
59
  i(w.size > 0 ? w : null, r, n);
62
60
  } else e.metaKey || e.ctrlKey ? i(/* @__PURE__ */ new Set([...u, ...o]), r, n) : i(o, r, n);
63
- }, g = h ?? (R ? "rect" : null);
61
+ }, g = h ?? (T ? "rect" : null);
64
62
  return {
65
63
  drag: s,
66
64
  preview: L,
@@ -83,11 +81,11 @@ function U(l) {
83
81
  return;
84
82
  }
85
83
  const o = s.path[s.path.length - 1];
86
- if (Math.hypot(e[0] - o[0], e[1] - o[1]) < _) return;
84
+ if (Math.hypot(e[0] - o[0], e[1] - o[1]) < K) return;
87
85
  const n = { tool: "lasso", path: [...s.path, e] };
88
86
  c(n), E(n);
89
87
  },
90
- onPointerUp: (t) => T(s, t),
88
+ onPointerUp: (t) => A(s, t),
91
89
  onPointerCancel: () => {
92
90
  c(null), f(null);
93
91
  }
@@ -95,7 +93,7 @@ function U(l) {
95
93
  };
96
94
  }
97
95
  export {
98
- N as cursorChip,
99
- U as useGesture
96
+ D as cursorChip,
97
+ G as useGesture
100
98
  };
101
99
  //# sourceMappingURL=gesture.js.map