@kanzo-tech/graph 0.18.0 → 0.20.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 (76) hide show
  1. package/README.md +25 -7
  2. package/dist/core/detail.d.ts +3 -1
  3. package/dist/core/detail.d.ts.map +1 -1
  4. package/dist/core/detail.js +55 -30
  5. package/dist/core/detail.js.map +1 -1
  6. package/dist/core/error.d.ts +16 -0
  7. package/dist/core/error.d.ts.map +1 -0
  8. package/dist/core/error.js +14 -0
  9. package/dist/core/error.js.map +1 -0
  10. package/dist/core/filter.d.ts +0 -13
  11. package/dist/core/filter.d.ts.map +1 -1
  12. package/dist/core/filter.js +47 -55
  13. package/dist/core/filter.js.map +1 -1
  14. package/dist/core/load.d.ts +5 -0
  15. package/dist/core/load.d.ts.map +1 -1
  16. package/dist/core/load.js +93 -78
  17. package/dist/core/load.js.map +1 -1
  18. package/dist/core/state.d.ts +21 -6
  19. package/dist/core/state.d.ts.map +1 -1
  20. package/dist/core/store.d.ts.map +1 -1
  21. package/dist/core/store.js +107 -101
  22. package/dist/core/store.js.map +1 -1
  23. package/dist/core/types.d.ts +4 -4
  24. package/dist/core/types.d.ts.map +1 -1
  25. package/dist/index.d.ts +8 -3
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +27 -19
  28. package/dist/index.js.map +1 -1
  29. package/dist/parts/graph-canvas.js +45 -45
  30. package/dist/parts/graph-canvas.js.map +1 -1
  31. package/dist/parts/graph-counts.d.ts +15 -0
  32. package/dist/parts/graph-counts.d.ts.map +1 -0
  33. package/dist/parts/graph-counts.js +41 -0
  34. package/dist/parts/graph-counts.js.map +1 -0
  35. package/dist/parts/graph-inspector.d.ts.map +1 -1
  36. package/dist/parts/graph-inspector.js +48 -48
  37. package/dist/parts/graph-inspector.js.map +1 -1
  38. package/dist/parts/graph-legend.d.ts +3 -2
  39. package/dist/parts/graph-legend.d.ts.map +1 -1
  40. package/dist/parts/graph-legend.js +30 -48
  41. package/dist/parts/graph-legend.js.map +1 -1
  42. package/dist/parts/graph-looks.d.ts +16 -0
  43. package/dist/parts/graph-looks.d.ts.map +1 -0
  44. package/dist/parts/graph-looks.js +138 -0
  45. package/dist/parts/graph-looks.js.map +1 -0
  46. package/dist/parts/graph-search.d.ts +17 -0
  47. package/dist/parts/graph-search.d.ts.map +1 -0
  48. package/dist/parts/graph-search.js +89 -0
  49. package/dist/parts/graph-search.js.map +1 -0
  50. package/dist/react/use-graph-prefs.d.ts +6 -2
  51. package/dist/react/use-graph-prefs.d.ts.map +1 -1
  52. package/dist/react/use-graph-prefs.js +7 -7
  53. package/dist/react/use-graph-prefs.js.map +1 -1
  54. package/dist/react/use-graph.js +61 -55
  55. package/dist/react/use-graph.js.map +1 -1
  56. package/dist/render/camera.d.ts +26 -0
  57. package/dist/render/camera.d.ts.map +1 -0
  58. package/dist/render/camera.js +40 -0
  59. package/dist/render/camera.js.map +1 -0
  60. package/dist/render/graph-looks.d.ts +10 -0
  61. package/dist/render/graph-looks.d.ts.map +1 -1
  62. package/dist/render/graph-looks.js +37 -20
  63. package/dist/render/graph-looks.js.map +1 -1
  64. package/dist/render/placement.d.ts +23 -0
  65. package/dist/render/placement.d.ts.map +1 -0
  66. package/dist/render/placement.js +23 -0
  67. package/dist/render/placement.js.map +1 -0
  68. package/dist/render/renderer.d.ts +1 -0
  69. package/dist/render/renderer.d.ts.map +1 -1
  70. package/dist/render/renderer.js +115 -96
  71. package/dist/render/renderer.js.map +1 -1
  72. package/dist/render/webgl.d.ts +5 -4
  73. package/dist/render/webgl.d.ts.map +1 -1
  74. package/dist/render/webgl.js +14 -11
  75. package/dist/render/webgl.js.map +1 -1
  76. package/package.json +10 -9
package/dist/core/load.js CHANGED
@@ -1,115 +1,130 @@
1
- import { Dictionary as P } from "./categories.js";
2
- import { projectionOf as C } from "./channels.js";
3
- import { columnsOf as I } from "./filter.js";
4
- const O = (o) => o.manifest.vertex_tables.filter((n) => n.position), v = (o) => (n) => o.properties.some((e) => e.name === n);
5
- async function x(o, n, e) {
6
- const r = o.scan(n);
1
+ import { GraphError as I } from "./error.js";
2
+ import { Dictionary as O } from "./categories.js";
3
+ import { projectionOf as g } from "./channels.js";
4
+ import { columnsOf as R } from "./filter.js";
5
+ const _ = (o) => o.manifest.vertex_tables.filter((t) => t.position), v = (o) => (t) => o.properties.some((e) => e.name === t);
6
+ function C(o, t) {
7
+ const e = new AbortController();
8
+ return t(AbortSignal.any([o, e.signal])).catch((r) => {
9
+ throw e.abort(), r;
10
+ });
11
+ }
12
+ async function x(o, t, e) {
13
+ const r = o.scan(t);
7
14
  return r.read(r.plan(), { signal: e });
8
15
  }
9
- function E(o, n, e, r) {
10
- const c = new P(r), s = new Uint32Array(n), f = e.size === void 0 ? null : new Float32Array(n).fill(Number.NaN);
16
+ function E(o, t, e, r) {
17
+ const c = new O(r), s = new Uint32Array(t), l = e.size === void 0 ? null : new Float32Array(t).fill(Number.NaN);
11
18
  return {
12
19
  add(a, i) {
13
- var m, w, b;
14
- const t = o[a], d = ((m = i.getChild(t.key)) == null ? void 0 : m.toArray()) ?? [], l = e.category === void 0 || (w = i.getChild(e.category)) == null ? void 0 : w.toArray(), u = e.size === void 0 || (b = i.getChild(e.size)) == null ? void 0 : b.toArray(), N = e.byTable ? c.code(t.name) : 0;
20
+ var d, N, b;
21
+ const n = o[a], m = ((d = i.getChild(n.key)) == null ? void 0 : d.toArray()) ?? [], f = e.category === void 0 || (N = i.getChild(e.category)) == null ? void 0 : N.toArray(), u = e.size === void 0 || (b = i.getChild(e.size)) == null ? void 0 : b.toArray(), w = e.byTable ? c.code(n.name) : 0;
15
22
  for (let y = 0; y < i.numRows; y++) {
16
- const h = Number(d[y]);
17
- h < n && (s[h] = e.byTable || e.category === void 0 ? N : c.code((l == null ? void 0 : l[y]) ?? null), f && (f[h] = Number((u == null ? void 0 : u[y]) ?? Number.NaN)));
23
+ const h = Number(m[y]);
24
+ h < t && (s[h] = e.byTable || e.category === void 0 ? w : c.code((f == null ? void 0 : f[y]) ?? null), l && (l[h] = Number((u == null ? void 0 : u[y]) ?? Number.NaN)));
18
25
  }
19
26
  },
20
27
  finish() {
21
- const a = c.ranks(), i = s.map((d) => a[d] ?? 0), t = [];
22
- return a.forEach((d, l) => {
23
- t[d] = c.values[l];
24
- }), { ranks: i, sizes: f, domain: t };
28
+ const a = c.ranks(), i = s.map((m) => a[m] ?? 0), n = [];
29
+ return a.forEach((m, f) => {
30
+ n[m] = c.values[f];
31
+ }), { ranks: i, sizes: l, domain: n };
25
32
  }
26
33
  };
27
34
  }
28
- function R(o) {
29
- let [n, e, r, c] = [1 / 0, 1 / 0, -1 / 0, -1 / 0];
35
+ function F(o) {
36
+ let [t, e, r, c] = [1 / 0, 1 / 0, -1 / 0, -1 / 0];
30
37
  for (let s = 0; s < o.length; s += 2) {
31
- const f = o[s], a = o[s + 1];
32
- Number.isNaN(f) || Number.isNaN(a) || (f < n && (n = f), f > r && (r = f), a < e && (e = a), a > c && (c = a));
38
+ const l = o[s], a = o[s + 1];
39
+ Number.isNaN(l) || Number.isNaN(a) || (l < t && (t = l), l > r && (r = l), a < e && (e = a), a > c && (c = a));
33
40
  }
34
- return n > r ? null : { x: n, y: e, w: r - n, h: c - e };
41
+ return t > r ? null : { x: t, y: e, w: r - t, h: c - e };
35
42
  }
36
- async function _(o, n, e, r) {
37
- const c = new Set(n.map((t) => t.name)), s = o.manifest.edge_tables.filter(
38
- (t) => c.has(t.source.references) && c.has(t.destination.references)
39
- ), f = await Promise.all(
40
- s.map((t) => x(o, { table: t.name, select: [t.source.key, t.destination.key] }, r))
41
- ), a = new Float32Array(2 * s.reduce((t, d) => t + d.record_count, 0));
43
+ async function S(o, t, e, r) {
44
+ const c = new Set(t.map((n) => n.name)), s = o.manifest.edge_tables.filter(
45
+ (n) => c.has(n.source.references) && c.has(n.destination.references)
46
+ ), l = await Promise.all(
47
+ s.map((n) => x(o, { table: n.name, select: [n.source.key, n.destination.key] }, r))
48
+ ), a = new Float32Array(2 * s.reduce((n, m) => n + m.record_count, 0));
42
49
  let i = 0;
43
- return f.forEach((t, d) => {
44
- var u, N;
45
- const l = s[d];
46
- for (const m of t) {
47
- const w = ((u = m.getChild(l.source.key)) == null ? void 0 : u.toArray()) ?? [], b = ((N = m.getChild(l.destination.key)) == null ? void 0 : N.toArray()) ?? [];
48
- for (let y = 0; y < m.numRows && i < a.length; y++) {
49
- const h = Number(w[y]), A = Number(b[y]);
50
- h < e && A < e && (a[i++] = h, a[i++] = A);
50
+ return l.forEach((n, m) => {
51
+ var u, w;
52
+ const f = s[m];
53
+ for (const d of n) {
54
+ const N = ((u = d.getChild(f.source.key)) == null ? void 0 : u.toArray()) ?? [], b = ((w = d.getChild(f.destination.key)) == null ? void 0 : w.toArray()) ?? [];
55
+ for (let y = 0; y < d.numRows && i < a.length; y++) {
56
+ const h = Number(N[y]), k = Number(b[y]);
57
+ h < e && k < e && (a[i++] = h, a[i++] = k);
51
58
  }
52
59
  }
53
60
  }), i === a.length ? a : a.slice(0, i);
54
61
  }
55
- async function j(o, n, e, r) {
56
- const c = O(o), s = c.reduce((l, u) => l + u.record_count, 0), f = new Float32Array(2 * s).fill(Number.NaN), a = new Uint16Array(s), i = E(c, s, n, e), [t, d] = await Promise.all([
57
- Promise.all(
58
- c.map((l) => {
59
- const { x: u, y: N } = l.position;
60
- return x(o, { table: l.name, select: C(n, [l.key, u, N], v(l)) }, r);
61
- })
62
- ),
63
- _(o, c, s, r)
64
- ]);
65
- return t.forEach((l, u) => {
66
- var w, b, y;
67
- const { key: N, position: m } = c[u];
68
- for (const h of l) {
69
- const A = ((w = h.getChild(N)) == null ? void 0 : w.toArray()) ?? [], z = ((b = h.getChild((m == null ? void 0 : m.x) ?? "")) == null ? void 0 : b.toArray()) ?? [], g = ((y = h.getChild((m == null ? void 0 : m.y) ?? "")) == null ? void 0 : y.toArray()) ?? [];
70
- for (let k = 0; k < h.numRows; k++) {
71
- const p = Number(A[k]);
72
- p < s && (f[p * 2] = Number(z[k] ?? Number.NaN), f[p * 2 + 1] = Number(g[k] ?? Number.NaN), a[p] = u);
62
+ async function D(o, t, e, r) {
63
+ const c = _(o), s = c.reduce((f, u) => f + u.record_count, 0), l = new Float32Array(2 * s).fill(Number.NaN), a = new Uint16Array(s), i = E(c, s, t, e), [n, m] = await C(
64
+ r,
65
+ (f) => Promise.all([
66
+ Promise.all(
67
+ c.map((u) => {
68
+ const { x: w, y: d } = u.position;
69
+ return x(o, { table: u.name, select: g(t, [u.key, w, d], v(u)) }, f);
70
+ })
71
+ ),
72
+ S(o, c, s, f)
73
+ ])
74
+ );
75
+ return n.forEach((f, u) => {
76
+ var N, b, y;
77
+ const { key: w, position: d } = c[u];
78
+ for (const h of f) {
79
+ const k = ((N = h.getChild(w)) == null ? void 0 : N.toArray()) ?? [], z = ((b = h.getChild((d == null ? void 0 : d.x) ?? "")) == null ? void 0 : b.toArray()) ?? [], P = ((y = h.getChild((d == null ? void 0 : d.y) ?? "")) == null ? void 0 : y.toArray()) ?? [];
80
+ for (let A = 0; A < h.numRows; A++) {
81
+ const p = Number(k[A]);
82
+ p < s && (l[p * 2] = Number(z[A] ?? Number.NaN), l[p * 2 + 1] = Number(P[A] ?? Number.NaN), a[p] = u);
73
83
  }
74
84
  i.add(u, h);
75
85
  }
76
- }), { geometry: { tables: c, size: s, positions: f, table: a, links: d, extent: R(f) }, encoding: i.finish() };
86
+ }), { geometry: { tables: c, size: s, positions: l, table: a, links: m, extent: F(l) }, encoding: i.finish() };
77
87
  }
78
- async function S(o, n, e, r, c) {
79
- const { tables: s, size: f } = n, a = E(s, f, e, r);
80
- return (await Promise.all(
81
- s.map((t) => x(o, { table: t.name, select: C(e, [t.key], v(t)) }, c))
82
- )).forEach((t, d) => {
83
- for (const l of t) a.add(d, l);
88
+ async function K(o, t, e, r, c) {
89
+ const { tables: s, size: l } = t, a = E(s, l, e, r);
90
+ return (await C(
91
+ c,
92
+ (n) => Promise.all(s.map((m) => x(o, { table: m.name, select: g(e, [m.key], v(m)) }, n)))
93
+ )).forEach((n, m) => {
94
+ for (const f of n) a.add(m, f);
84
95
  }), a.finish();
85
96
  }
86
- async function D(o, n, e, r) {
87
- const c = I(e), s = n.flatMap((i, t) => c.every(v(i)) ? [t] : []);
97
+ async function L(o, t, e, r) {
98
+ const c = R(e), s = t.flatMap((i, n) => c.every(v(i)) ? [n] : []);
88
99
  if (s.length === 0)
89
- throw new Error(`no drawn vertex type has every column this filter names: ${c.join(", ")}`);
90
- const f = await Promise.all(
91
- s.map((i) => x(o, { table: n[i].name, filter: e, select: [n[i].key] }, r))
100
+ throw new I("graph/untranslatable-filter", `no drawn vertex type has every column this filter names: ${c.join(", ")}`);
101
+ const l = await C(
102
+ r,
103
+ (i) => Promise.all(
104
+ s.map((n) => x(o, { table: t[n].name, filter: e, select: [t[n].key] }, i))
105
+ )
92
106
  ), a = [];
93
- return f.forEach((i, t) => {
94
- var l;
95
- const { key: d } = n[s[t]];
107
+ return l.forEach((i, n) => {
108
+ var f;
109
+ const { key: m } = t[s[n]];
96
110
  for (const u of i) {
97
- const N = ((l = u.getChild(d)) == null ? void 0 : l.toArray()) ?? [];
98
- for (let m = 0; m < u.numRows; m++) a.push(Number(N[m]));
111
+ const w = ((f = u.getChild(m)) == null ? void 0 : f.toArray()) ?? [];
112
+ for (let d = 0; d < u.numRows; d++) a.push(Number(w[d]));
99
113
  }
100
114
  }), { filtered: new Set(s), ids: a };
101
115
  }
102
- function G(o, n) {
116
+ function M(o, t) {
103
117
  const e = new Uint8Array(o.size);
104
- for (let r = 0; r < o.size; r++) e[r] = n.filtered.has(o.table[r]) ? 0 : 1;
105
- for (const r of n.ids) r < o.size && (e[r] = 1);
118
+ for (let r = 0; r < o.size; r++) e[r] = t.filtered.has(o.table[r]) ? 0 : 1;
119
+ for (const r of t.ids) r < o.size && (e[r] = 1);
106
120
  return e;
107
121
  }
108
122
  export {
109
- O as drawnTables,
110
- S as loadEncoding,
111
- j as loadGraph,
112
- G as maskOf,
113
- D as readKept
123
+ _ as drawnTables,
124
+ K as loadEncoding,
125
+ D as loadGraph,
126
+ M as maskOf,
127
+ L as readKept,
128
+ C as together
114
129
  };
115
130
  //# sourceMappingURL=load.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"load.js","sources":["../../src/core/load.ts"],"sourcesContent":["import { Dictionary } from \"./categories\";\nimport { projectionOf, type Binding } from \"./channels\";\nimport type { Batch, Corpus, EdgeTable, Filter, VertexTable } from \"@fossil-lang/corpus\";\nimport { columnsOf } from \"./filter\";\n\n/**\n * **The whole graph, read once and laid out as cosmos.gl's buffers.** A drawn vertex's `dense_id` is\n * its index, so every array is sized from the manifest's `record_count`s before a row arrives, and a\n * row is written where its id says. The camera never reaches here: nothing is read because it moved.\n */\n\n/** Where the drawn vertices are and how they connect — read once per corpus. */\nexport interface Geometry {\n /** The vertex tables with a position, in the manifest's order. */\n readonly tables: readonly VertexTable[];\n /** Drawn vertices: ids `0 … size − 1`. */\n readonly size: number;\n /** `[x, y, …]` by id; `NaN` where no row has a position. */\n readonly positions: Float32Array;\n /** By id, the vertex's index in `tables`. */\n readonly table: Uint16Array;\n /** `[src, dst, …]` by id, every relation whose two ends are drawn. */\n readonly links: Float32Array;\n readonly extent: { readonly x: number; readonly y: number; readonly w: number; readonly h: number } | null;\n}\n\n/** What the bound channels say about each vertex — read again when a binding changes. */\nexport interface Encoding {\n /** By id, the category's rank. */\n readonly ranks: Uint32Array;\n /** By id, the ramp's raw value, or `null` when `r` is unbound. */\n readonly sizes: Float32Array | null;\n /** What each rank is: the seed, then the other values seen, in rank order. */\n readonly domain: readonly unknown[];\n}\n\n/** The vertex tables fossil lays out or the program places; a table without a position is not drawn. */\nexport const drawnTables = (corpus: Corpus): VertexTable[] => corpus.manifest.vertex_tables.filter((table) => table.position);\n\nconst has = (table: VertexTable) => (column: string) => table.properties.some((p) => p.name === column);\n\nasync function readAll(corpus: Corpus, params: Parameters<Corpus[\"scan\"]>[0], signal: AbortSignal): Promise<readonly Batch[]> {\n const scan = corpus.scan(params);\n return scan.read(scan.plan(), { signal });\n}\n\nfunction encoder(tables: readonly VertexTable[], size: number, binding: Binding, seed: readonly unknown[]) {\n const dictionary = new Dictionary(seed);\n const codes = new Uint32Array(size);\n const sizes = binding.size === undefined ? null : new Float32Array(size).fill(Number.NaN);\n return {\n add(t: number, batch: Batch) {\n const table = tables[t] as VertexTable;\n const ids = batch.getChild(table.key)?.toArray() ?? [];\n const values = binding.category === undefined ? undefined : batch.getChild(binding.category)?.toArray();\n const ramp = binding.size === undefined ? undefined : batch.getChild(binding.size)?.toArray();\n const own = binding.byTable ? dictionary.code(table.name) : 0;\n for (let i = 0; i < batch.numRows; i++) {\n const id = Number(ids[i]);\n if (!(id < size)) continue;\n codes[id] = binding.byTable || binding.category === undefined ? own : dictionary.code(values?.[i] ?? null);\n if (sizes) sizes[id] = Number(ramp?.[i] ?? Number.NaN);\n }\n },\n finish(): Encoding {\n const order = dictionary.ranks();\n const ranks = codes.map((code) => order[code] ?? 0);\n const domain: unknown[] = [];\n order.forEach((rank, code) => {\n domain[rank] = dictionary.values[code];\n });\n return { ranks, sizes, domain };\n },\n };\n}\n\nfunction extentOf(positions: Float32Array): Geometry[\"extent\"] {\n let [x0, y0, x1, y1] = [Infinity, Infinity, -Infinity, -Infinity];\n for (let i = 0; i < positions.length; i += 2) {\n const x = positions[i] as number;\n const y = positions[i + 1] as number;\n if (Number.isNaN(x) || Number.isNaN(y)) continue;\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n if (y < y0) y0 = y;\n if (y > y1) y1 = y;\n }\n return x0 > x1 ? null : { x: x0, y: y0, w: x1 - x0, h: y1 - y0 };\n}\n\nasync function readLinks(corpus: Corpus, tables: readonly VertexTable[], size: number, signal: AbortSignal): Promise<Float32Array> {\n const drawn = new Set(tables.map((table) => table.name));\n const relations = corpus.manifest.edge_tables.filter(\n (edge: EdgeTable) => drawn.has(edge.source.references) && drawn.has(edge.destination.references),\n );\n const answers = await Promise.all(\n relations.map((edge) => readAll(corpus, { table: edge.name, select: [edge.source.key, edge.destination.key] }, signal)),\n );\n const links = new Float32Array(2 * relations.reduce((sum, edge) => sum + edge.record_count, 0));\n let at = 0;\n answers.forEach((batches, r) => {\n const edge = relations[r] as EdgeTable;\n for (const batch of batches) {\n const src = batch.getChild(edge.source.key)?.toArray() ?? [];\n const dst = batch.getChild(edge.destination.key)?.toArray() ?? [];\n for (let e = 0; e < batch.numRows && at < links.length; e++) {\n const a = Number(src[e]);\n const b = Number(dst[e]);\n if (!(a < size && b < size)) continue;\n links[at++] = a;\n links[at++] = b;\n }\n }\n });\n return at === links.length ? links : links.slice(0, at);\n}\n\n/** One scan per drawn table and one per relation between them, read whole, in parallel. */\nexport async function loadGraph(\n corpus: Corpus,\n binding: Binding,\n seed: readonly unknown[],\n signal: AbortSignal,\n): Promise<{ geometry: Geometry; encoding: Encoding }> {\n const tables = drawnTables(corpus);\n const size = tables.reduce((sum, table) => sum + table.record_count, 0);\n const positions = new Float32Array(2 * size).fill(Number.NaN);\n const table = new Uint16Array(size);\n const encode = encoder(tables, size, binding, seed);\n const [vertices, links] = await Promise.all([\n Promise.all(\n tables.map((t) => {\n const { x, y } = t.position as NonNullable<VertexTable[\"position\"]>;\n return readAll(corpus, { table: t.name, select: projectionOf(binding, [t.key, x, y], has(t)) }, signal);\n }),\n ),\n readLinks(corpus, tables, size, signal),\n ]);\n vertices.forEach((batches, t) => {\n const { key, position } = tables[t] as VertexTable;\n for (const batch of batches) {\n const ids = batch.getChild(key)?.toArray() ?? [];\n const xs = batch.getChild(position?.x ?? \"\")?.toArray() ?? [];\n const ys = batch.getChild(position?.y ?? \"\")?.toArray() ?? [];\n for (let i = 0; i < batch.numRows; i++) {\n const id = Number(ids[i]);\n if (!(id < size)) continue;\n positions[id * 2] = Number(xs[i] ?? Number.NaN);\n positions[id * 2 + 1] = Number(ys[i] ?? Number.NaN);\n table[id] = t;\n }\n encode.add(t, batch);\n }\n });\n return { geometry: { tables, size, positions, table, links, extent: extentOf(positions) }, encoding: encode.finish() };\n}\n\n/** A new binding re-reads the channels and nothing else: the positions and the links stay uploaded. */\nexport async function loadEncoding(\n corpus: Corpus,\n geometry: Geometry,\n binding: Binding,\n seed: readonly unknown[],\n signal: AbortSignal,\n): Promise<Encoding> {\n const { tables, size } = geometry;\n const encode = encoder(tables, size, binding, seed);\n const answers = await Promise.all(\n tables.map((t) => readAll(corpus, { table: t.name, select: projectionOf(binding, [t.key], has(t)) }, signal)),\n );\n answers.forEach((batches, t) => {\n for (const batch of batches) encode.add(t, batch);\n });\n return encode.finish();\n}\n\n/** What a filter kept: per table that holds every column it names, the surviving ids. */\nexport interface Kept {\n readonly filtered: ReadonlySet<number>;\n readonly ids: readonly number[];\n}\n\n/**\n * **A predicate, applied as a mask.** A table that lacks a column the filter names is not filtered,\n * which is what a `WHERE` over a union of the tables would do; a filter no drawn table can answer at\n * all is refused, so the unfiltered picture is never drawn as the filtered one.\n */\nexport async function readKept(corpus: Corpus, tables: readonly VertexTable[], filter: Filter, signal: AbortSignal): Promise<Kept> {\n const columns = columnsOf(filter);\n const filtered = tables.flatMap((table, t) => (columns.every(has(table)) ? [t] : []));\n if (filtered.length === 0) {\n throw new Error(`no drawn vertex type has every column this filter names: ${columns.join(\", \")}`);\n }\n const answers = await Promise.all(\n filtered.map((t) => readAll(corpus, { table: (tables[t] as VertexTable).name, filter, select: [(tables[t] as VertexTable).key] }, signal)),\n );\n const ids: number[] = [];\n answers.forEach((batches, i) => {\n const { key } = tables[filtered[i] as number] as VertexTable;\n for (const batch of batches) {\n const column = batch.getChild(key)?.toArray() ?? [];\n for (let r = 0; r < batch.numRows; r++) ids.push(Number(column[r]));\n }\n });\n return { filtered: new Set(filtered), ids };\n}\n\n/** `1` where a vertex survives the page's filter. */\nexport function maskOf(geometry: Geometry, kept: Kept): Uint8Array {\n const mask = new Uint8Array(geometry.size);\n for (let id = 0; id < geometry.size; id++) mask[id] = kept.filtered.has(geometry.table[id] as number) ? 0 : 1;\n for (const id of kept.ids) if (id < geometry.size) mask[id] = 1;\n return mask;\n}\n"],"names":["drawnTables","corpus","table","has","column","p","readAll","params","signal","scan","encoder","tables","size","binding","seed","dictionary","Dictionary","codes","sizes","t","batch","ids","_a","values","_b","ramp","_c","own","i","id","order","ranks","code","domain","rank","extentOf","positions","x0","y0","x1","y1","x","y","readLinks","drawn","relations","edge","answers","links","sum","at","batches","r","src","dst","e","a","b","loadGraph","encode","vertices","projectionOf","key","position","xs","ys","loadEncoding","geometry","readKept","filter","columns","columnsOf","filtered","maskOf","kept","mask"],"mappings":"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"}
1
+ {"version":3,"file":"load.js","sources":["../../src/core/load.ts"],"sourcesContent":["import { GraphError } from \"./error\";\nimport { Dictionary } from \"./categories\";\nimport { projectionOf, type Binding } from \"./channels\";\nimport type { Batch, Corpus, EdgeTable, Filter, VertexTable } from \"@fossil-lang/corpus\";\nimport { columnsOf } from \"./filter\";\n\n/**\n * **The whole graph, read once and laid out as cosmos.gl's buffers.** A drawn vertex's `dense_id` is\n * its index, so every array is sized from the manifest's `record_count`s before a row arrives, and a\n * row is written where its id says. The camera never reaches here: nothing is read because it moved.\n */\n\n/** Where the drawn vertices are and how they connect — read once per corpus. */\nexport interface Geometry {\n /** The vertex tables with a position, in the manifest's order. */\n readonly tables: readonly VertexTable[];\n /** Drawn vertices: ids `0 … size − 1`. */\n readonly size: number;\n /** `[x, y, …]` by id; `NaN` where no row has a position. */\n readonly positions: Float32Array;\n /** By id, the vertex's index in `tables`. */\n readonly table: Uint16Array;\n /** `[src, dst, …]` by id, every relation whose two ends are drawn. */\n readonly links: Float32Array;\n readonly extent: { readonly x: number; readonly y: number; readonly w: number; readonly h: number } | null;\n}\n\n/** What the bound channels say about each vertex — read again when a binding changes. */\nexport interface Encoding {\n /** By id, the category's rank. */\n readonly ranks: Uint32Array;\n /** By id, the ramp's raw value, or `null` when `r` is unbound. */\n readonly sizes: Float32Array | null;\n /** What each rank is: the seed, then the other values seen, in rank order. */\n readonly domain: readonly unknown[];\n}\n\n/** The vertex tables fossil lays out or the program places; a table without a position is not drawn. */\nexport const drawnTables = (corpus: Corpus): VertexTable[] => corpus.manifest.vertex_tables.filter((table) => table.position);\n\nconst has = (table: VertexTable) => (column: string) => table.properties.some((p) => p.name === column);\n\n/**\n * Reads in parallel that end together: the first to fail aborts the rest, so no read outlives the\n * answer and no second failure goes unheard behind the first.\n */\nexport function together<T>(signal: AbortSignal, reads: (signal: AbortSignal) => Promise<T>): Promise<T> {\n const local = new AbortController();\n return reads(AbortSignal.any([signal, local.signal])).catch((error: unknown) => {\n local.abort();\n throw error;\n });\n}\n\nasync function readAll(corpus: Corpus, params: Parameters<Corpus[\"scan\"]>[0], signal: AbortSignal): Promise<readonly Batch[]> {\n const scan = corpus.scan(params);\n return scan.read(scan.plan(), { signal });\n}\n\nfunction encoder(tables: readonly VertexTable[], size: number, binding: Binding, seed: readonly unknown[]) {\n const dictionary = new Dictionary(seed);\n const codes = new Uint32Array(size);\n const sizes = binding.size === undefined ? null : new Float32Array(size).fill(Number.NaN);\n return {\n add(t: number, batch: Batch) {\n const table = tables[t] as VertexTable;\n const ids = batch.getChild(table.key)?.toArray() ?? [];\n const values = binding.category === undefined ? undefined : batch.getChild(binding.category)?.toArray();\n const ramp = binding.size === undefined ? undefined : batch.getChild(binding.size)?.toArray();\n const own = binding.byTable ? dictionary.code(table.name) : 0;\n for (let i = 0; i < batch.numRows; i++) {\n const id = Number(ids[i]);\n if (!(id < size)) continue;\n codes[id] = binding.byTable || binding.category === undefined ? own : dictionary.code(values?.[i] ?? null);\n if (sizes) sizes[id] = Number(ramp?.[i] ?? Number.NaN);\n }\n },\n finish(): Encoding {\n const order = dictionary.ranks();\n const ranks = codes.map((code) => order[code] ?? 0);\n const domain: unknown[] = [];\n order.forEach((rank, code) => {\n domain[rank] = dictionary.values[code];\n });\n return { ranks, sizes, domain };\n },\n };\n}\n\nfunction extentOf(positions: Float32Array): Geometry[\"extent\"] {\n let [x0, y0, x1, y1] = [Infinity, Infinity, -Infinity, -Infinity];\n for (let i = 0; i < positions.length; i += 2) {\n const x = positions[i] as number;\n const y = positions[i + 1] as number;\n if (Number.isNaN(x) || Number.isNaN(y)) continue;\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n if (y < y0) y0 = y;\n if (y > y1) y1 = y;\n }\n return x0 > x1 ? null : { x: x0, y: y0, w: x1 - x0, h: y1 - y0 };\n}\n\nasync function readLinks(corpus: Corpus, tables: readonly VertexTable[], size: number, signal: AbortSignal): Promise<Float32Array> {\n const drawn = new Set(tables.map((table) => table.name));\n const relations = corpus.manifest.edge_tables.filter(\n (edge: EdgeTable) => drawn.has(edge.source.references) && drawn.has(edge.destination.references),\n );\n const answers = await Promise.all(\n relations.map((edge) => readAll(corpus, { table: edge.name, select: [edge.source.key, edge.destination.key] }, signal)),\n );\n const links = new Float32Array(2 * relations.reduce((sum, edge) => sum + edge.record_count, 0));\n let at = 0;\n answers.forEach((batches, r) => {\n const edge = relations[r] as EdgeTable;\n for (const batch of batches) {\n const src = batch.getChild(edge.source.key)?.toArray() ?? [];\n const dst = batch.getChild(edge.destination.key)?.toArray() ?? [];\n for (let e = 0; e < batch.numRows && at < links.length; e++) {\n const a = Number(src[e]);\n const b = Number(dst[e]);\n if (!(a < size && b < size)) continue;\n links[at++] = a;\n links[at++] = b;\n }\n }\n });\n return at === links.length ? links : links.slice(0, at);\n}\n\n/** One scan per drawn table and one per relation between them, read whole, in parallel. */\nexport async function loadGraph(\n corpus: Corpus,\n binding: Binding,\n seed: readonly unknown[],\n signal: AbortSignal,\n): Promise<{ geometry: Geometry; encoding: Encoding }> {\n const tables = drawnTables(corpus);\n const size = tables.reduce((sum, table) => sum + table.record_count, 0);\n const positions = new Float32Array(2 * size).fill(Number.NaN);\n const table = new Uint16Array(size);\n const encode = encoder(tables, size, binding, seed);\n const [vertices, links] = await together(signal, (signal) =>\n Promise.all([\n Promise.all(\n tables.map((t) => {\n const { x, y } = t.position as NonNullable<VertexTable[\"position\"]>;\n return readAll(corpus, { table: t.name, select: projectionOf(binding, [t.key, x, y], has(t)) }, signal);\n }),\n ),\n readLinks(corpus, tables, size, signal),\n ]),\n );\n vertices.forEach((batches, t) => {\n const { key, position } = tables[t] as VertexTable;\n for (const batch of batches) {\n const ids = batch.getChild(key)?.toArray() ?? [];\n const xs = batch.getChild(position?.x ?? \"\")?.toArray() ?? [];\n const ys = batch.getChild(position?.y ?? \"\")?.toArray() ?? [];\n for (let i = 0; i < batch.numRows; i++) {\n const id = Number(ids[i]);\n if (!(id < size)) continue;\n positions[id * 2] = Number(xs[i] ?? Number.NaN);\n positions[id * 2 + 1] = Number(ys[i] ?? Number.NaN);\n table[id] = t;\n }\n encode.add(t, batch);\n }\n });\n return { geometry: { tables, size, positions, table, links, extent: extentOf(positions) }, encoding: encode.finish() };\n}\n\n/** A new binding re-reads the channels and nothing else: the positions and the links stay uploaded. */\nexport async function loadEncoding(\n corpus: Corpus,\n geometry: Geometry,\n binding: Binding,\n seed: readonly unknown[],\n signal: AbortSignal,\n): Promise<Encoding> {\n const { tables, size } = geometry;\n const encode = encoder(tables, size, binding, seed);\n const answers = await together(signal, (signal) =>\n Promise.all(tables.map((t) => readAll(corpus, { table: t.name, select: projectionOf(binding, [t.key], has(t)) }, signal))),\n );\n answers.forEach((batches, t) => {\n for (const batch of batches) encode.add(t, batch);\n });\n return encode.finish();\n}\n\n/** What a filter kept: per table that holds every column it names, the surviving ids. */\nexport interface Kept {\n readonly filtered: ReadonlySet<number>;\n readonly ids: readonly number[];\n}\n\n/**\n * **A predicate, applied as a mask.** A table that lacks a column the filter names is not filtered,\n * which is what a `WHERE` over a union of the tables would do; a filter no drawn table can answer at\n * all is refused, so the unfiltered picture is never drawn as the filtered one.\n */\nexport async function readKept(corpus: Corpus, tables: readonly VertexTable[], filter: Filter, signal: AbortSignal): Promise<Kept> {\n const columns = columnsOf(filter);\n const filtered = tables.flatMap((table, t) => (columns.every(has(table)) ? [t] : []));\n if (filtered.length === 0) {\n throw new GraphError(\"graph/untranslatable-filter\", `no drawn vertex type has every column this filter names: ${columns.join(\", \")}`);\n }\n const answers = await together(signal, (signal) =>\n Promise.all(\n filtered.map((t) => readAll(corpus, { table: (tables[t] as VertexTable).name, filter, select: [(tables[t] as VertexTable).key] }, signal)),\n ),\n );\n const ids: number[] = [];\n answers.forEach((batches, i) => {\n const { key } = tables[filtered[i] as number] as VertexTable;\n for (const batch of batches) {\n const column = batch.getChild(key)?.toArray() ?? [];\n for (let r = 0; r < batch.numRows; r++) ids.push(Number(column[r]));\n }\n });\n return { filtered: new Set(filtered), ids };\n}\n\n/** `1` where a vertex survives the page's filter. */\nexport function maskOf(geometry: Geometry, kept: Kept): Uint8Array {\n const mask = new Uint8Array(geometry.size);\n for (let id = 0; id < geometry.size; id++) mask[id] = kept.filtered.has(geometry.table[id] as number) ? 0 : 1;\n for (const id of kept.ids) if (id < geometry.size) mask[id] = 1;\n return mask;\n}\n"],"names":["drawnTables","corpus","table","has","column","p","together","signal","reads","local","error","readAll","params","scan","encoder","tables","size","binding","seed","dictionary","Dictionary","codes","sizes","t","batch","ids","_a","values","_b","ramp","_c","own","i","id","order","ranks","code","domain","rank","extentOf","positions","x0","y0","x1","y1","x","y","readLinks","drawn","relations","edge","answers","links","sum","at","batches","r","src","dst","e","a","b","loadGraph","encode","vertices","projectionOf","key","position","xs","ys","loadEncoding","geometry","readKept","filter","columns","columnsOf","filtered","GraphError","maskOf","kept","mask"],"mappings":";;;;AAsCO,MAAMA,IAAc,CAACC,MAAkCA,EAAO,SAAS,cAAc,OAAO,CAACC,MAAUA,EAAM,QAAQ,GAEtHC,IAAM,CAACD,MAAuB,CAACE,MAAmBF,EAAM,WAAW,KAAK,CAACG,MAAMA,EAAE,SAASD,CAAM;AAM/F,SAASE,EAAYC,GAAqBC,GAAwD;AACvG,QAAMC,IAAQ,IAAI,gBAAA;AAClB,SAAOD,EAAM,YAAY,IAAI,CAACD,GAAQE,EAAM,MAAM,CAAC,CAAC,EAAE,MAAM,CAACC,MAAmB;AAC9E,UAAAD,EAAM,MAAA,GACAC;AAAA,EACR,CAAC;AACH;AAEA,eAAeC,EAAQV,GAAgBW,GAAuCL,GAAgD;AAC5H,QAAMM,IAAOZ,EAAO,KAAKW,CAAM;AAC/B,SAAOC,EAAK,KAAKA,EAAK,QAAQ,EAAE,QAAAN,GAAQ;AAC1C;AAEA,SAASO,EAAQC,GAAgCC,GAAcC,GAAkBC,GAA0B;AACzG,QAAMC,IAAa,IAAIC,EAAWF,CAAI,GAChCG,IAAQ,IAAI,YAAYL,CAAI,GAC5BM,IAAQL,EAAQ,SAAS,SAAY,OAAO,IAAI,aAAaD,CAAI,EAAE,KAAK,OAAO,GAAG;AACxF,SAAO;AAAA,IACL,IAAIO,GAAWC,GAAc;;AAC3B,YAAMtB,IAAQa,EAAOQ,CAAC,GAChBE,MAAMC,IAAAF,EAAM,SAAStB,EAAM,GAAG,MAAxB,gBAAAwB,EAA2B,cAAa,CAAA,GAC9CC,IAASV,EAAQ,aAAa,WAAwBW,IAAAJ,EAAM,SAASP,EAAQ,QAAQ,MAA/B,OAAZ,SAAYW,EAAkC,WACxFC,IAAOZ,EAAQ,SAAS,WAAwBa,IAAAN,EAAM,SAASP,EAAQ,IAAI,MAA3B,OAAZ,SAAYa,EAA8B,WAC9EC,IAAMd,EAAQ,UAAUE,EAAW,KAAKjB,EAAM,IAAI,IAAI;AAC5D,eAAS8B,IAAI,GAAGA,IAAIR,EAAM,SAASQ,KAAK;AACtC,cAAMC,IAAK,OAAOR,EAAIO,CAAC,CAAC;AACxB,QAAMC,IAAKjB,MACXK,EAAMY,CAAE,IAAIhB,EAAQ,WAAWA,EAAQ,aAAa,SAAYc,IAAMZ,EAAW,MAAKQ,KAAA,gBAAAA,EAASK,OAAM,IAAI,GACrGV,QAAaW,CAAE,IAAI,QAAOJ,KAAA,gBAAAA,EAAOG,OAAM,OAAO,GAAG;AAAA,MACvD;AAAA,IACF;AAAA,IACA,SAAmB;AACjB,YAAME,IAAQf,EAAW,MAAA,GACnBgB,IAAQd,EAAM,IAAI,CAACe,MAASF,EAAME,CAAI,KAAK,CAAC,GAC5CC,IAAoB,CAAA;AAC1B,aAAAH,EAAM,QAAQ,CAACI,GAAMF,MAAS;AAC5B,QAAAC,EAAOC,CAAI,IAAInB,EAAW,OAAOiB,CAAI;AAAA,MACvC,CAAC,GACM,EAAE,OAAAD,GAAO,OAAAb,GAAO,QAAAe,EAAA;AAAA,IACzB;AAAA,EAAA;AAEJ;AAEA,SAASE,EAASC,GAA6C;AAC7D,MAAI,CAACC,GAAIC,GAAIC,GAAIC,CAAE,IAAI,CAAC,OAAU,OAAU,QAAW,MAAS;AAChE,WAASZ,IAAI,GAAGA,IAAIQ,EAAU,QAAQR,KAAK,GAAG;AAC5C,UAAMa,IAAIL,EAAUR,CAAC,GACfc,IAAIN,EAAUR,IAAI,CAAC;AACzB,IAAI,OAAO,MAAMa,CAAC,KAAK,OAAO,MAAMC,CAAC,MACjCD,IAAIJ,MAAIA,IAAKI,IACbA,IAAIF,MAAIA,IAAKE,IACbC,IAAIJ,MAAIA,IAAKI,IACbA,IAAIF,MAAIA,IAAKE;AAAA,EACnB;AACA,SAAOL,IAAKE,IAAK,OAAO,EAAE,GAAGF,GAAI,GAAGC,GAAI,GAAGC,IAAKF,GAAI,GAAGG,IAAKF,EAAA;AAC9D;AAEA,eAAeK,EAAU9C,GAAgBc,GAAgCC,GAAcT,GAA4C;AACjI,QAAMyC,IAAQ,IAAI,IAAIjC,EAAO,IAAI,CAACb,MAAUA,EAAM,IAAI,CAAC,GACjD+C,IAAYhD,EAAO,SAAS,YAAY;AAAA,IAC5C,CAACiD,MAAoBF,EAAM,IAAIE,EAAK,OAAO,UAAU,KAAKF,EAAM,IAAIE,EAAK,YAAY,UAAU;AAAA,EAAA,GAE3FC,IAAU,MAAM,QAAQ;AAAA,IAC5BF,EAAU,IAAI,CAACC,MAASvC,EAAQV,GAAQ,EAAE,OAAOiD,EAAK,MAAM,QAAQ,CAACA,EAAK,OAAO,KAAKA,EAAK,YAAY,GAAG,EAAA,GAAK3C,CAAM,CAAC;AAAA,EAAA,GAElH6C,IAAQ,IAAI,aAAa,IAAIH,EAAU,OAAO,CAACI,GAAKH,MAASG,IAAMH,EAAK,cAAc,CAAC,CAAC;AAC9F,MAAII,IAAK;AACT,SAAAH,EAAQ,QAAQ,CAACI,GAASC,MAAM;;AAC9B,UAAMN,IAAOD,EAAUO,CAAC;AACxB,eAAWhC,KAAS+B,GAAS;AAC3B,YAAME,MAAM/B,IAAAF,EAAM,SAAS0B,EAAK,OAAO,GAAG,MAA9B,gBAAAxB,EAAiC,cAAa,CAAA,GACpDgC,MAAM9B,IAAAJ,EAAM,SAAS0B,EAAK,YAAY,GAAG,MAAnC,gBAAAtB,EAAsC,cAAa,CAAA;AAC/D,eAAS+B,IAAI,GAAGA,IAAInC,EAAM,WAAW8B,IAAKF,EAAM,QAAQO,KAAK;AAC3D,cAAMC,IAAI,OAAOH,EAAIE,CAAC,CAAC,GACjBE,IAAI,OAAOH,EAAIC,CAAC,CAAC;AACvB,QAAMC,IAAI5C,KAAQ6C,IAAI7C,MACtBoC,EAAME,GAAI,IAAIM,GACdR,EAAME,GAAI,IAAIO;AAAA,MAChB;AAAA,IACF;AAAA,EACF,CAAC,GACMP,MAAOF,EAAM,SAASA,IAAQA,EAAM,MAAM,GAAGE,CAAE;AACxD;AAGA,eAAsBQ,EACpB7D,GACAgB,GACAC,GACAX,GACqD;AACrD,QAAMQ,IAASf,EAAYC,CAAM,GAC3Be,IAAOD,EAAO,OAAO,CAACsC,GAAKnD,MAAUmD,IAAMnD,EAAM,cAAc,CAAC,GAChEsC,IAAY,IAAI,aAAa,IAAIxB,CAAI,EAAE,KAAK,OAAO,GAAG,GACtDd,IAAQ,IAAI,YAAYc,CAAI,GAC5B+C,IAASjD,EAAQC,GAAQC,GAAMC,GAASC,CAAI,GAC5C,CAAC8C,GAAUZ,CAAK,IAAI,MAAM9C;AAAA,IAASC;AAAA,IAAQ,CAACA,MAChD,QAAQ,IAAI;AAAA,MACV,QAAQ;AAAA,QACNQ,EAAO,IAAI,CAACQ,MAAM;AAChB,gBAAM,EAAE,GAAAsB,GAAG,GAAAC,EAAA,IAAMvB,EAAE;AACnB,iBAAOZ,EAAQV,GAAQ,EAAE,OAAOsB,EAAE,MAAM,QAAQ0C,EAAahD,GAAS,CAACM,EAAE,KAAKsB,GAAGC,CAAC,GAAG3C,EAAIoB,CAAC,CAAC,EAAA,GAAKhB,CAAM;AAAA,QACxG,CAAC;AAAA,MAAA;AAAA,MAEHwC,EAAU9C,GAAQc,GAAQC,GAAMT,CAAM;AAAA,IAAA,CACvC;AAAA,EAAA;AAEH,SAAAyD,EAAS,QAAQ,CAACT,GAAShC,MAAM;;AAC/B,UAAM,EAAE,KAAA2C,GAAK,UAAAC,MAAapD,EAAOQ,CAAC;AAClC,eAAWC,KAAS+B,GAAS;AAC3B,YAAM9B,MAAMC,IAAAF,EAAM,SAAS0C,CAAG,MAAlB,gBAAAxC,EAAqB,cAAa,CAAA,GACxC0C,MAAKxC,IAAAJ,EAAM,UAAS2C,KAAA,gBAAAA,EAAU,MAAK,EAAE,MAAhC,gBAAAvC,EAAmC,cAAa,CAAA,GACrDyC,MAAKvC,IAAAN,EAAM,UAAS2C,KAAA,gBAAAA,EAAU,MAAK,EAAE,MAAhC,gBAAArC,EAAmC,cAAa,CAAA;AAC3D,eAASE,IAAI,GAAGA,IAAIR,EAAM,SAASQ,KAAK;AACtC,cAAMC,IAAK,OAAOR,EAAIO,CAAC,CAAC;AACxB,QAAMC,IAAKjB,MACXwB,EAAUP,IAAK,CAAC,IAAI,OAAOmC,EAAGpC,CAAC,KAAK,OAAO,GAAG,GAC9CQ,EAAUP,IAAK,IAAI,CAAC,IAAI,OAAOoC,EAAGrC,CAAC,KAAK,OAAO,GAAG,GAClD9B,EAAM+B,CAAE,IAAIV;AAAA,MACd;AACA,MAAAwC,EAAO,IAAIxC,GAAGC,CAAK;AAAA,IACrB;AAAA,EACF,CAAC,GACM,EAAE,UAAU,EAAE,QAAAT,GAAQ,MAAAC,GAAM,WAAAwB,GAAW,OAAAtC,GAAO,OAAAkD,GAAO,QAAQb,EAASC,CAAS,EAAA,GAAK,UAAUuB,EAAO,SAAO;AACrH;AAGA,eAAsBO,EACpBrE,GACAsE,GACAtD,GACAC,GACAX,GACmB;AACnB,QAAM,EAAE,QAAAQ,GAAQ,MAAAC,EAAA,IAASuD,GACnBR,IAASjD,EAAQC,GAAQC,GAAMC,GAASC,CAAI;AAIlD,UAHgB,MAAMZ;AAAA,IAASC;AAAA,IAAQ,CAACA,MACtC,QAAQ,IAAIQ,EAAO,IAAI,CAACQ,MAAMZ,EAAQV,GAAQ,EAAE,OAAOsB,EAAE,MAAM,QAAQ0C,EAAahD,GAAS,CAACM,EAAE,GAAG,GAAGpB,EAAIoB,CAAC,CAAC,EAAA,GAAKhB,CAAM,CAAC,CAAC;AAAA,EAAA,GAEnH,QAAQ,CAACgD,GAAShC,MAAM;AAC9B,eAAWC,KAAS+B,EAAS,CAAAQ,EAAO,IAAIxC,GAAGC,CAAK;AAAA,EAClD,CAAC,GACMuC,EAAO,OAAA;AAChB;AAaA,eAAsBS,EAASvE,GAAgBc,GAAgC0D,GAAgBlE,GAAoC;AACjI,QAAMmE,IAAUC,EAAUF,CAAM,GAC1BG,IAAW7D,EAAO,QAAQ,CAACb,GAAOqB,MAAOmD,EAAQ,MAAMvE,EAAID,CAAK,CAAC,IAAI,CAACqB,CAAC,IAAI,CAAA,CAAG;AACpF,MAAIqD,EAAS,WAAW;AACtB,UAAM,IAAIC,EAAW,+BAA+B,4DAA4DH,EAAQ,KAAK,IAAI,CAAC,EAAE;AAEtI,QAAMvB,IAAU,MAAM7C;AAAA,IAASC;AAAA,IAAQ,CAACA,MACtC,QAAQ;AAAA,MACNqE,EAAS,IAAI,CAACrD,MAAMZ,EAAQV,GAAQ,EAAE,OAAQc,EAAOQ,CAAC,EAAkB,MAAM,QAAAkD,GAAQ,QAAQ,CAAE1D,EAAOQ,CAAC,EAAkB,GAAG,EAAA,GAAKhB,CAAM,CAAC;AAAA,IAAA;AAAA,EAC3I,GAEIkB,IAAgB,CAAA;AACtB,SAAA0B,EAAQ,QAAQ,CAACI,GAASvB,MAAM;;AAC9B,UAAM,EAAE,KAAAkC,EAAA,IAAQnD,EAAO6D,EAAS5C,CAAC,CAAW;AAC5C,eAAWR,KAAS+B,GAAS;AAC3B,YAAMnD,MAASsB,IAAAF,EAAM,SAAS0C,CAAG,MAAlB,gBAAAxC,EAAqB,cAAa,CAAA;AACjD,eAAS8B,IAAI,GAAGA,IAAIhC,EAAM,SAASgC,IAAK,CAAA/B,EAAI,KAAK,OAAOrB,EAAOoD,CAAC,CAAC,CAAC;AAAA,IACpE;AAAA,EACF,CAAC,GACM,EAAE,UAAU,IAAI,IAAIoB,CAAQ,GAAG,KAAAnD,EAAA;AACxC;AAGO,SAASqD,EAAOP,GAAoBQ,GAAwB;AACjE,QAAMC,IAAO,IAAI,WAAWT,EAAS,IAAI;AACzC,WAAStC,IAAK,GAAGA,IAAKsC,EAAS,MAAMtC,IAAM,CAAA+C,EAAK/C,CAAE,IAAI8C,EAAK,SAAS,IAAIR,EAAS,MAAMtC,CAAE,CAAW,IAAI,IAAI;AAC5G,aAAWA,KAAM8C,EAAK,IAAK,CAAI9C,IAAKsC,EAAS,SAAMS,EAAK/C,CAAE,IAAI;AAC9D,SAAO+C;AACT;"}
@@ -9,6 +9,9 @@ export interface GraphOptions extends Channels {
9
9
  /**
10
10
  * The corpus the host opened with fossil's `open`, or the promise of it. A promise is what makes
11
11
  * *opening* a state the graph can report; `null` is no corpus at all.
12
+ *
13
+ * The promise must settle. The graph shows *opening* until it does and sets no deadline of its
14
+ * own: the waits inside an open are fossil's to bound, and a rejection reaches `onFailure`.
12
15
  */
13
16
  corpus: Corpus | PromiseLike<Corpus> | null;
14
17
  /** Which column the size ramp is spent on — Plot's `r`. */
@@ -31,22 +34,32 @@ export interface GraphOptions extends Channels {
31
34
  * positions are drawn as they are. `GraphToolbar` starts and stops the layout whatever this says.
32
35
  */
33
36
  simulate?: boolean;
34
- /** Required: unhandled, a browser with no WebGL context shows an empty box. */
35
- onFailure: (message: string) => void;
37
+ /**
38
+ * Every failure, as it was thrown: fossil's own errors arrive whole, with their `code`, and the
39
+ * graph's are `GraphError`s. Required: unhandled, a browser with no WebGL context shows an empty box.
40
+ */
41
+ onFailure: (error: unknown) => void;
36
42
  onSelect?: (selection: Selection | null) => void;
37
43
  onFocus?: (vertex: VertexId | null) => void;
38
44
  }
39
45
  /**
40
46
  * Where the graph is in its life. `none` is no corpus; `opening` is a corpus promised and not yet
41
47
  * open; `loading` is the graph, a binding or a filter not yet read or not yet drawn; `idle` is all of
42
- * it drawn; `failed` is a corpus that would not open or read, or a canvas that could not start a
43
- * renderer.
48
+ * it drawn; `failed` is a corpus that would not open or read, or a canvas with no GPU device to draw
49
+ * with — none came up, or the one it had was lost.
50
+ *
51
+ * **It is the data's life, not the layout's.** A layout running over a drawn graph is `idle` here and
52
+ * `running` in `motion`: two axes, because each can move without the other — a filter loads under a
53
+ * paused layout, and a layout runs over a graph with nothing left to read. A host that shows one word
54
+ * reads both, `motion === "running"` as "laying out" and `progress` for how far.
44
55
  */
45
56
  export type GraphStatus = "none" | "opening" | "loading" | "idle" | "failed";
46
57
  /** What the loaded graph holds, under the page's filter. */
47
58
  export interface Drawn {
48
59
  /** Vertices drawn: every one with a position that survives the filter. */
49
60
  readonly vertices: number;
61
+ /** Links drawn: every loaded relation whose two ends are drawn. */
62
+ readonly edges: number;
50
63
  /** What each category rank is: the seed first, then any other value seen, in rank order. */
51
64
  readonly domain: readonly unknown[];
52
65
  /** Per rank, the vertices drawn. */
@@ -99,8 +112,10 @@ export interface GraphStore {
99
112
  setTool(tool: Tool): void;
100
113
  report(motion: Motion): void;
101
114
  reportProgress(value: number): void;
102
- /** Whether the canvas has a renderer: without one nothing will ever be drawn. */
103
- setRenderable(renderable: boolean): void;
115
+ /** The canvas has a renderer again. */
116
+ renderable(): void;
117
+ /** The canvas cannot draw: the graph is `failed`, and `error` goes to `onFailure`. */
118
+ unrenderable(error: unknown): void;
104
119
  /** The renderer uploaded this snapshot's geometry, encoding and mask. */
105
120
  reportDrawn(snapshot: GraphSnapshot): void;
106
121
  }
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/core/state.ts"],"names":[],"mappings":"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"}
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":"AAMA,OAAO,KAAK,EAAS,YAAY,EAA8B,UAAU,EAAE,MAAM,SAAS,CAAC;AAE3F,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAqBvG,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,UAAU,CA8V7D"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/core/store.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAS,YAAY,EAA8B,UAAU,EAAE,MAAM,SAAS,CAAC;AAE3F,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AA4BvG,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,UAAU,CAiW7D"}