tinybase 2.0.0-beta.0 → 2.0.0-beta.3

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 (63) hide show
  1. package/lib/checkpoints.d.ts +4 -3
  2. package/lib/checkpoints.js +1 -1
  3. package/lib/checkpoints.js.gz +0 -0
  4. package/lib/common.js +1 -1
  5. package/lib/common.js.gz +0 -0
  6. package/lib/debug/checkpoints.d.ts +4 -3
  7. package/lib/debug/checkpoints.js +13 -16
  8. package/lib/debug/common.js +4 -1
  9. package/lib/debug/indexes.d.ts +4 -2
  10. package/lib/debug/indexes.js +13 -15
  11. package/lib/debug/metrics.d.ts +1 -1
  12. package/lib/debug/metrics.js +13 -16
  13. package/lib/debug/persisters.d.ts +6 -0
  14. package/lib/debug/queries.d.ts +249 -299
  15. package/lib/debug/queries.js +67 -192
  16. package/lib/debug/relationships.d.ts +6 -5
  17. package/lib/debug/relationships.js +13 -16
  18. package/lib/debug/store.d.ts +386 -86
  19. package/lib/debug/store.js +278 -216
  20. package/lib/debug/tinybase.js +318 -390
  21. package/lib/debug/ui-react.d.ts +4320 -1796
  22. package/lib/debug/ui-react.js +380 -98
  23. package/lib/indexes.d.ts +4 -2
  24. package/lib/indexes.js +1 -1
  25. package/lib/indexes.js.gz +0 -0
  26. package/lib/metrics.d.ts +1 -1
  27. package/lib/metrics.js +1 -1
  28. package/lib/metrics.js.gz +0 -0
  29. package/lib/persisters.d.ts +6 -0
  30. package/lib/queries.d.ts +249 -299
  31. package/lib/queries.js +1 -1
  32. package/lib/queries.js.gz +0 -0
  33. package/lib/relationships.d.ts +6 -5
  34. package/lib/relationships.js +1 -1
  35. package/lib/relationships.js.gz +0 -0
  36. package/lib/store.d.ts +386 -86
  37. package/lib/store.js +1 -1
  38. package/lib/store.js.gz +0 -0
  39. package/lib/tinybase.js +1 -1
  40. package/lib/tinybase.js.gz +0 -0
  41. package/lib/ui-react.d.ts +4320 -1796
  42. package/lib/ui-react.js +1 -1
  43. package/lib/ui-react.js.gz +0 -0
  44. package/lib/umd/checkpoints.js +1 -1
  45. package/lib/umd/checkpoints.js.gz +0 -0
  46. package/lib/umd/common.js +1 -1
  47. package/lib/umd/common.js.gz +0 -0
  48. package/lib/umd/indexes.js +1 -1
  49. package/lib/umd/indexes.js.gz +0 -0
  50. package/lib/umd/metrics.js +1 -1
  51. package/lib/umd/metrics.js.gz +0 -0
  52. package/lib/umd/queries.js +1 -1
  53. package/lib/umd/queries.js.gz +0 -0
  54. package/lib/umd/relationships.js +1 -1
  55. package/lib/umd/relationships.js.gz +0 -0
  56. package/lib/umd/store.js +1 -1
  57. package/lib/umd/store.js.gz +0 -0
  58. package/lib/umd/tinybase.js +1 -1
  59. package/lib/umd/tinybase.js.gz +0 -0
  60. package/lib/umd/ui-react.js +1 -1
  61. package/lib/umd/ui-react.js.gz +0 -0
  62. package/package.json +26 -26
  63. package/readme.md +2 -2
@@ -93,12 +93,13 @@ export type CheckpointListener = (
93
93
  */
94
94
  export type CheckpointsListenerStats = {
95
95
  /**
96
- * The number of CheckpointIdsListeners registered with the Checkpoints
97
- * object.
96
+ * The number of CheckpointIdsListener functions registered with the
97
+ * Checkpoints object.
98
98
  */
99
99
  checkpointIds?: number;
100
100
  /**
101
- * The number of CheckpointListeners registered with the Checkpoints object.
101
+ * The number of CheckpointListener functions registered with the Checkpoints
102
+ * object.
102
103
  */
103
104
  checkpoint?: number;
104
105
  };
@@ -1 +1 @@
1
- const e=(e,t)=>e.includes(t),t=(e,t)=>e.forEach(t),n=e=>e.length,r=e=>0==n(e),o=(e,...t)=>e.push(...t),s=e=>e.pop(),c=e=>null==e,l=(e,t,n)=>c(e)?n?.():t(e),i=(e,t)=>e?.has(t)??!1,a=e=>c(e)||0==(e=>e.size)(e),d=(e,t)=>e?.forEach(t),u=(e,t)=>e?.delete(t),h=e=>new Map(e),p=(e,t)=>e?.get(t),C=(e,t,n)=>c(n)?(u(e,t),e):e?.set(t,n),g=(e,t,n)=>(i(e,t)||e.set(t,n()),p(e,t)),k=(e,t,r,o,s=0)=>l((r?g:p)(e,t[s],s>n(t)-2?r:h),(c=>{if(s>n(t)-2)return o?.(c)&&C(e,t[s]),c;const l=k(c,t,r,o,s+1);return a(c)&&C(e,t[s]),l})),f=e=>new Set(e),v=(e,r=[""])=>{const s=[],c=(e,l)=>l==n(r)?o(s,e):t([r[l],null],(t=>c(p(e,t),l+1)));return c(e,0),s},L=Object.freeze,w=(e=>{const t=new WeakMap;return n=>(t.has(n)||t.set(n,e(n)),t.get(n))})((w=>{let S,z,E,y=100,I=h(),M=1;const b=h(),j=h(),[x,B,F]=(e=>{let r,i=0;const g=[],L=h();return[(t,n,o)=>{r??=e();const c=s(g)??""+i++;var l;return C(L,c,[t,n,o]),l=c,k(n,o??[""],f)?.add(l),c},(e,n,...o)=>t(v(e,n),(e=>d(e,(e=>l(p(L,e),(([e])=>e(r,...n??[],...o))))))),e=>l(p(L,e),(([,t,r])=>(k(t,r??[""],void 0,(t=>(u(t,e),a(t)?1:0))),C(L,e),n(g)<1e3&&o(g,e),r))),(e,t)=>{return n=v(e,t),r=c,!n.every(r);var n,r},(e,o,s)=>l(p(L,e),(([e,,l=[]])=>{const i=(...a)=>{const d=n(a);d==n(l)?e(r,...a,...s(a)):c(l[d])?t(o[d](...a),(e=>i(...a,e))):i(...a,l[d])};i()}))]})((()=>V)),O=h(),T=h(),W=[],m=[],q=(e,t)=>{M=0,w.transaction((()=>d(p(O,t),((t,n)=>d(t,((t,r)=>d(t,((t,o)=>((e,t,n,r,o)=>c(o)?e.delCell(t,n,r,!0):e.setCell(t,n,r,o))(w,n,r,o,t[e]))))))))),M=1},A=e=>{C(O,e),C(T,e),B(j,[e])},D=(e,r)=>t(((e,t)=>e.splice(0,t))(e,r??n(e)),A),G=()=>D(W,n(W)-y),H=w.addCellListener(null,null,null,((e,t,n,r,c,i)=>{if(M){l(S,(()=>{o(W,S),G(),D(m),S=void 0,E=1}));const e=g(I,t,h),d=g(e,n,h),u=g(d,r,(()=>[i,void 0]));u[1]=c,u[0]===c&&a(C(d,r))&&a(C(e,n))&&a(C(I,t))&&(S=s(W),E=1),P()}})),J=(e="")=>(c(S)&&(S=""+z++,C(O,S,I),R(S,e),I=h(),E=1),S),K=()=>{r(W)||(m.unshift(J()),q(0,S),S=s(W),E=1)},N=()=>{r(m)||(o(W,S),S=m.shift(),q(1,S),E=1)},P=()=>{E&&(B(b),E=0)},Q=e=>{const t=J(e);return P(),t},R=(e,t)=>(U(e)&&p(T,e)!==t&&(C(T,e,t),B(j,[e])),V),U=e=>i(O,e),V={setSize:e=>(y=e,G(),V),addCheckpoint:Q,setCheckpoint:R,getStore:()=>w,getCheckpointIds:()=>[[...W],S,[...m]],forEachCheckpoint:e=>{return t=e,d(T,((e,n)=>t(n,e)));var t},hasCheckpoint:U,getCheckpoint:e=>p(T,e),goBackward:()=>(K(),P(),V),goForward:()=>(N(),P(),V),goTo:t=>{const n=e(W,t)?K:e(m,t)?N:null;for(;!c(n)&&t!=S;)n();return P(),V},addCheckpointIdsListener:e=>x(e,b),addCheckpointListener:(e,t)=>x(t,j,[e]),delListener:e=>(F(e),V),clear:()=>(D(W),D(m),c(S)||A(S),S=void 0,z=0,Q(),V),destroy:()=>{w.delListener(H)},getListenerStats:()=>({})};return L(V.clear())}));export{w as createCheckpoints};
1
+ const e=(e,t)=>e.includes(t),t=(e,t)=>e.forEach(t),n=e=>e.length,r=e=>0==n(e),o=(e,...t)=>e.push(...t),s=e=>e.pop(),l=e=>null==e,c=(e,t,n)=>l(e)?n?.():t(e),i=(e,t)=>e?.has(t)??!1,a=e=>l(e)||0==(e=>e.size)(e),d=(e,t)=>e?.forEach(t),u=(e,t)=>e?.delete(t),h=e=>new Map(e),p=(e,t)=>e?.get(t),C=(e,t,n)=>l(n)?(u(e,t),e):e?.set(t,n),g=(e,t,n)=>(i(e,t)||C(e,t,n()),p(e,t)),k=(e,t,r,o,s=0)=>c((r?g:p)(e,t[s],s>n(t)-2?r:h),(l=>{if(s>n(t)-2)return o?.(l)&&C(e,t[s]),l;const c=k(l,t,r,o,s+1);return a(l)&&C(e,t[s]),c})),f=e=>new Set(e),v=e=>{let r,i=0;const g=[],v=h();return[(t,n,o)=>{r??=e();const l=s(g)??""+i++;var c,a;return C(v,l,[t,n,o]),c=k(n,o??[""],f),a=l,c?.add(a),l},(e,s,...l)=>t(((e,r=[""])=>{const s=[],l=(e,c)=>c==n(r)?o(s,e):null===r[c]?d(e,(e=>l(e,c+1))):t([r[c],null],(t=>l(p(e,t),c+1)));return l(e,0),s})(e,s),(e=>d(e,(e=>p(v,e)[0](r,...s??[],...l))))),e=>c(p(v,e),(([,t,r])=>(k(t,r??[""],void 0,(t=>(u(t,e),a(t)?1:0))),C(v,e),n(g)<1e3&&o(g,e),r))),(e,o,s)=>c(p(v,e),(([e,,c=[]])=>{const i=(...a)=>{const d=n(a);d==n(c)?e(r,...a,...s(a)):l(c[d])?t(o[d](...a),(e=>i(...a,e))):i(...a,c[d])};i()}))]},L=Object.freeze,w=(e=>{const t=new WeakMap;return n=>(t.has(n)||t.set(n,e(n)),t.get(n))})((u=>{let k,f,w,S=100,z=h(),E=1;const I=h(),M=h(),[b,j,x]=v((()=>Q)),y=h(),B=h(),F=[],O=[],T=(e,t)=>{E=0,u.transaction((()=>d(p(y,t),((t,n)=>d(t,((t,r)=>d(t,((t,o)=>((e,t,n,r,o)=>l(o)?e.delCell(t,n,r,!0):e.setCell(t,n,r,o))(u,n,r,o,t[e]))))))))),E=1},W=e=>{C(y,e),C(B,e),j(M,[e])},m=(e,r)=>t(((e,t)=>e.splice(0,t))(e,r??n(e)),W),q=()=>m(F,n(F)-S),A=u.addCellListener(null,null,null,((e,t,n,r,l,i)=>{if(E){c(k,(()=>{o(F,k),q(),m(O),k=void 0,w=1}));const e=g(z,t,h),d=g(e,n,h),u=g(d,r,(()=>[i,void 0]));u[1]=l,u[0]===l&&a(C(d,r))&&a(C(e,n))&&a(C(z,t))&&(k=s(F),w=1),J()}})),D=(e="")=>(l(k)&&(k=""+f++,C(y,k,z),N(k,e),z=h(),w=1),k),G=()=>{r(F)||(O.unshift(D()),T(0,k),k=s(F),w=1)},H=()=>{r(O)||(o(F,k),k=O.shift(),T(1,k),w=1)},J=()=>{w&&(j(I),w=0)},K=e=>{const t=D(e);return J(),t},N=(e,t)=>(P(e)&&p(B,e)!==t&&(C(B,e,t),j(M,[e])),Q),P=e=>i(y,e),Q={setSize:e=>(S=e,q(),Q),addCheckpoint:K,setCheckpoint:N,getStore:()=>u,getCheckpointIds:()=>[[...F],k,[...O]],forEachCheckpoint:e=>{return t=e,d(B,((e,n)=>t(n,e)));var t},hasCheckpoint:P,getCheckpoint:e=>p(B,e),goBackward:()=>(G(),J(),Q),goForward:()=>(H(),J(),Q),goTo:t=>{const n=e(F,t)?G:e(O,t)?H:null;for(;!l(n)&&t!=k;)n();return J(),Q},addCheckpointIdsListener:e=>b(e,I),addCheckpointListener:(e,t)=>b(t,M,[e]),delListener:e=>(x(e),Q),clear:()=>(m(F),m(O),l(k)||W(k),k=void 0,f=0,K(),Q),destroy:()=>{u.delListener(A)},getListenerStats:()=>({})};return L(Q.clear())}));export{w as createCheckpoints};
Binary file
package/lib/common.js CHANGED
@@ -1 +1 @@
1
- const o=(o,t)=>o<t?-1:1;export{o as defaultSorter};
1
+ const o=(o,t)=>o<t?-1:1,t=o=>""+o;export{o as defaultSorter,t as id};
package/lib/common.js.gz CHANGED
Binary file
@@ -93,12 +93,13 @@ export type CheckpointListener = (
93
93
  */
94
94
  export type CheckpointsListenerStats = {
95
95
  /**
96
- * The number of CheckpointIdsListeners registered with the Checkpoints
97
- * object.
96
+ * The number of CheckpointIdsListener functions registered with the
97
+ * Checkpoints object.
98
98
  */
99
99
  checkpointIds?: number;
100
100
  /**
101
- * The number of CheckpointListeners registered with the Checkpoints object.
101
+ * The number of CheckpointListener functions registered with the Checkpoints
102
+ * object.
102
103
  */
103
104
  checkpoint?: number;
104
105
  };
@@ -1,7 +1,6 @@
1
1
  const EMPTY_STRING = '';
2
2
 
3
3
  const arrayHas = (array, value) => array.includes(value);
4
- const arrayEvery = (array, cb) => array.every(cb);
5
4
  const arrayForEach = (array, cb) => array.forEach(cb);
6
5
  const arrayLength = (array) => array.length;
7
6
  const arrayIsEmpty = (array) => arrayLength(array) == 0;
@@ -32,7 +31,7 @@ const mapSet = (map, key, value) =>
32
31
  isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
33
32
  const mapEnsure = (map, key, getDefaultValue) => {
34
33
  if (!collHas(map, key)) {
35
- map.set(key, getDefaultValue());
34
+ mapSet(map, key, getDefaultValue());
36
35
  }
37
36
  return mapGet(map, key);
38
37
  };
@@ -72,32 +71,32 @@ const getCreateFunction = (getFunction) => {
72
71
  };
73
72
 
74
73
  const getWildcardedLeaves = (deepIdSet, path = [EMPTY_STRING]) => {
75
- const sets = [];
76
- const deep = (set, p) =>
74
+ const leaves = [];
75
+ const deep = (node, p) =>
77
76
  p == arrayLength(path)
78
- ? arrayPush(sets, set)
79
- : arrayForEach([path[p], null], (id) => deep(mapGet(set, id), p + 1));
77
+ ? arrayPush(leaves, node)
78
+ : path[p] === null
79
+ ? collForEach(node, (node2) => deep(node2, p + 1))
80
+ : arrayForEach([path[p], null], (id) => deep(mapGet(node, id), p + 1));
80
81
  deep(deepIdSet, 0);
81
- return sets;
82
+ return leaves;
82
83
  };
83
84
  const getListenerFunctions = (getThing) => {
84
85
  let thing;
85
86
  let nextId = 0;
86
87
  const listenerPool = [];
87
88
  const allListeners = mapNew();
88
- const addListener = (listener, idSetNode, idOrNulls) => {
89
+ const addListener = (listener, idSetNode, path) => {
89
90
  thing ??= getThing();
90
91
  const id = arrayPop(listenerPool) ?? EMPTY_STRING + nextId++;
91
- mapSet(allListeners, id, [listener, idSetNode, idOrNulls]);
92
- setAdd(visitTree(idSetNode, idOrNulls ?? [EMPTY_STRING], setNew), id);
92
+ mapSet(allListeners, id, [listener, idSetNode, path]);
93
+ setAdd(visitTree(idSetNode, path ?? [EMPTY_STRING], setNew), id);
93
94
  return id;
94
95
  };
95
96
  const callListeners = (idSetNode, ids, ...extraArgs) =>
96
97
  arrayForEach(getWildcardedLeaves(idSetNode, ids), (set) =>
97
98
  collForEach(set, (id) =>
98
- ifNotUndefined(mapGet(allListeners, id), ([listener]) =>
99
- listener(thing, ...(ids ?? []), ...extraArgs),
100
- ),
99
+ mapGet(allListeners, id)[0](thing, ...(ids ?? []), ...extraArgs),
101
100
  ),
102
101
  );
103
102
  const delListener = (id) =>
@@ -112,8 +111,6 @@ const getListenerFunctions = (getThing) => {
112
111
  }
113
112
  return idOrNulls;
114
113
  });
115
- const hasListeners = (idSetNode, ids) =>
116
- !arrayEvery(getWildcardedLeaves(idSetNode, ids), isUndefined);
117
114
  const callListener = (id, idNullGetters, extraArgsGetter) =>
118
115
  ifNotUndefined(mapGet(allListeners, id), ([listener, , idOrNulls = []]) => {
119
116
  const callWithIds = (...ids) => {
@@ -128,7 +125,7 @@ const getListenerFunctions = (getThing) => {
128
125
  };
129
126
  callWithIds();
130
127
  });
131
- return [addListener, callListeners, delListener, hasListeners, callListener];
128
+ return [addListener, callListeners, delListener, callListener];
132
129
  };
133
130
 
134
131
  const object = Object;
@@ -1,3 +1,6 @@
1
+ const EMPTY_STRING = '';
2
+
1
3
  const defaultSorter = (sortKey1, sortKey2) => (sortKey1 < sortKey2 ? -1 : 1);
4
+ const id = (key) => EMPTY_STRING + key;
2
5
 
3
- export {defaultSorter};
6
+ export {defaultSorter, id};
@@ -128,11 +128,13 @@ export type SliceRowIdsListener = (
128
128
  */
129
129
  export type IndexesListenerStats = {
130
130
  /**
131
- * The number of SlideIdsListeners registered with the Indexes object.
131
+ * The number of SlideIdsListener functions registered with the Indexes
132
+ * object.
132
133
  */
133
134
  sliceIds?: number;
134
135
  /**
135
- * The number of SliceRowIdsListeners registered with the Indexes object.
136
+ * The number of SliceRowIdsListener functions registered with the Indexes
137
+ * object.
136
138
  */
137
139
  sliceRowIds?: number;
138
140
  };
@@ -42,7 +42,7 @@ const mapSet = (map, key, value) =>
42
42
  isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
43
43
  const mapEnsure = (map, key, getDefaultValue) => {
44
44
  if (!collHas(map, key)) {
45
- map.set(key, getDefaultValue());
45
+ mapSet(map, key, getDefaultValue());
46
46
  }
47
47
  return mapGet(map, key);
48
48
  };
@@ -225,32 +225,32 @@ const getCreateFunction = (getFunction) => {
225
225
  const defaultSorter = (sortKey1, sortKey2) => (sortKey1 < sortKey2 ? -1 : 1);
226
226
 
227
227
  const getWildcardedLeaves = (deepIdSet, path = [EMPTY_STRING]) => {
228
- const sets = [];
229
- const deep = (set, p) =>
228
+ const leaves = [];
229
+ const deep = (node, p) =>
230
230
  p == arrayLength(path)
231
- ? arrayPush(sets, set)
232
- : arrayForEach([path[p], null], (id) => deep(mapGet(set, id), p + 1));
231
+ ? arrayPush(leaves, node)
232
+ : path[p] === null
233
+ ? collForEach(node, (node2) => deep(node2, p + 1))
234
+ : arrayForEach([path[p], null], (id) => deep(mapGet(node, id), p + 1));
233
235
  deep(deepIdSet, 0);
234
- return sets;
236
+ return leaves;
235
237
  };
236
238
  const getListenerFunctions = (getThing) => {
237
239
  let thing;
238
240
  let nextId = 0;
239
241
  const listenerPool = [];
240
242
  const allListeners = mapNew();
241
- const addListener = (listener, idSetNode, idOrNulls) => {
243
+ const addListener = (listener, idSetNode, path) => {
242
244
  thing ??= getThing();
243
245
  const id = arrayPop(listenerPool) ?? EMPTY_STRING + nextId++;
244
- mapSet(allListeners, id, [listener, idSetNode, idOrNulls]);
245
- setAdd(visitTree(idSetNode, idOrNulls ?? [EMPTY_STRING], setNew), id);
246
+ mapSet(allListeners, id, [listener, idSetNode, path]);
247
+ setAdd(visitTree(idSetNode, path ?? [EMPTY_STRING], setNew), id);
246
248
  return id;
247
249
  };
248
250
  const callListeners = (idSetNode, ids, ...extraArgs) =>
249
251
  arrayForEach(getWildcardedLeaves(idSetNode, ids), (set) =>
250
252
  collForEach(set, (id) =>
251
- ifNotUndefined(mapGet(allListeners, id), ([listener]) =>
252
- listener(thing, ...(ids ?? []), ...extraArgs),
253
- ),
253
+ mapGet(allListeners, id)[0](thing, ...(ids ?? []), ...extraArgs),
254
254
  ),
255
255
  );
256
256
  const delListener = (id) =>
@@ -265,8 +265,6 @@ const getListenerFunctions = (getThing) => {
265
265
  }
266
266
  return idOrNulls;
267
267
  });
268
- const hasListeners = (idSetNode, ids) =>
269
- !arrayEvery(getWildcardedLeaves(idSetNode, ids), isUndefined);
270
268
  const callListener = (id, idNullGetters, extraArgsGetter) =>
271
269
  ifNotUndefined(mapGet(allListeners, id), ([listener, , idOrNulls = []]) => {
272
270
  const callWithIds = (...ids) => {
@@ -281,7 +279,7 @@ const getListenerFunctions = (getThing) => {
281
279
  };
282
280
  callWithIds();
283
281
  });
284
- return [addListener, callListeners, delListener, hasListeners, callListener];
282
+ return [addListener, callListeners, delListener, callListener];
285
283
  };
286
284
 
287
285
  const object = Object;
@@ -186,7 +186,7 @@ export type MetricListener = (
186
186
  */
187
187
  export type MetricsListenerStats = {
188
188
  /**
189
- * The number of MetricListeners registered with the Metrics object.
189
+ * The number of MetricListener functions registered with the Metrics object.
190
190
  */
191
191
  metric?: number;
192
192
  };
@@ -7,7 +7,6 @@ const AVG = 'avg';
7
7
  const MIN = 'min';
8
8
  const MAX = 'max';
9
9
 
10
- const arrayEvery = (array, cb) => array.every(cb);
11
10
  const arrayForEach = (array, cb) => array.forEach(cb);
12
11
  const arraySum = (array) => arrayReduce(array, (i, j) => i + j, 0);
13
12
  const arrayLength = (array) => array.length;
@@ -46,7 +45,7 @@ const mapSet = (map, key, value) =>
46
45
  isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
47
46
  const mapEnsure = (map, key, getDefaultValue) => {
48
47
  if (!collHas(map, key)) {
49
- map.set(key, getDefaultValue());
48
+ mapSet(map, key, getDefaultValue());
50
49
  }
51
50
  return mapGet(map, key);
52
51
  };
@@ -296,32 +295,32 @@ const getCreateFunction = (getFunction) => {
296
295
  };
297
296
 
298
297
  const getWildcardedLeaves = (deepIdSet, path = [EMPTY_STRING]) => {
299
- const sets = [];
300
- const deep = (set, p) =>
298
+ const leaves = [];
299
+ const deep = (node, p) =>
301
300
  p == arrayLength(path)
302
- ? arrayPush(sets, set)
303
- : arrayForEach([path[p], null], (id) => deep(mapGet(set, id), p + 1));
301
+ ? arrayPush(leaves, node)
302
+ : path[p] === null
303
+ ? collForEach(node, (node2) => deep(node2, p + 1))
304
+ : arrayForEach([path[p], null], (id) => deep(mapGet(node, id), p + 1));
304
305
  deep(deepIdSet, 0);
305
- return sets;
306
+ return leaves;
306
307
  };
307
308
  const getListenerFunctions = (getThing) => {
308
309
  let thing;
309
310
  let nextId = 0;
310
311
  const listenerPool = [];
311
312
  const allListeners = mapNew();
312
- const addListener = (listener, idSetNode, idOrNulls) => {
313
+ const addListener = (listener, idSetNode, path) => {
313
314
  thing ??= getThing();
314
315
  const id = arrayPop(listenerPool) ?? EMPTY_STRING + nextId++;
315
- mapSet(allListeners, id, [listener, idSetNode, idOrNulls]);
316
- setAdd(visitTree(idSetNode, idOrNulls ?? [EMPTY_STRING], setNew), id);
316
+ mapSet(allListeners, id, [listener, idSetNode, path]);
317
+ setAdd(visitTree(idSetNode, path ?? [EMPTY_STRING], setNew), id);
317
318
  return id;
318
319
  };
319
320
  const callListeners = (idSetNode, ids, ...extraArgs) =>
320
321
  arrayForEach(getWildcardedLeaves(idSetNode, ids), (set) =>
321
322
  collForEach(set, (id) =>
322
- ifNotUndefined(mapGet(allListeners, id), ([listener]) =>
323
- listener(thing, ...(ids ?? []), ...extraArgs),
324
- ),
323
+ mapGet(allListeners, id)[0](thing, ...(ids ?? []), ...extraArgs),
325
324
  ),
326
325
  );
327
326
  const delListener = (id) =>
@@ -336,8 +335,6 @@ const getListenerFunctions = (getThing) => {
336
335
  }
337
336
  return idOrNulls;
338
337
  });
339
- const hasListeners = (idSetNode, ids) =>
340
- !arrayEvery(getWildcardedLeaves(idSetNode, ids), isUndefined);
341
338
  const callListener = (id, idNullGetters, extraArgsGetter) =>
342
339
  ifNotUndefined(mapGet(allListeners, id), ([listener, , idOrNulls = []]) => {
343
340
  const callWithIds = (...ids) => {
@@ -352,7 +349,7 @@ const getListenerFunctions = (getThing) => {
352
349
  };
353
350
  callWithIds();
354
351
  });
355
- return [addListener, callListeners, delListener, hasListeners, callListener];
352
+ return [addListener, callListeners, delListener, callListener];
356
353
  };
357
354
 
358
355
  const object = Object;
@@ -40,7 +40,13 @@ import {Callback} from './common.d';
40
40
  * @category Development
41
41
  */
42
42
  export type PersisterStats = {
43
+ /**
44
+ * The number of times data has been loaded.
45
+ */
43
46
  loads?: number;
47
+ /**
48
+ * The number of times data has been saved.
49
+ */
44
50
  saves?: number;
45
51
  };
46
52