tinybase 5.0.0-beta.4 → 5.0.0-beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/checkpoints.js +1 -1
- package/lib/checkpoints.js.gz +0 -0
- package/lib/cjs/checkpoints.cjs +1 -1
- package/lib/cjs/checkpoints.cjs.gz +0 -0
- package/lib/cjs/indexes.cjs +1 -1
- package/lib/cjs/indexes.cjs.gz +0 -0
- package/lib/cjs/mergeable-store.cjs +1 -1
- package/lib/cjs/mergeable-store.cjs.gz +0 -0
- package/lib/cjs/metrics.cjs +1 -1
- package/lib/cjs/metrics.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-automerge.cjs +1 -1
- package/lib/cjs/persisters/persister-automerge.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-browser.cjs +1 -1
- package/lib/cjs/persisters/persister-browser.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs +1 -1
- package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-electric-sql.cjs +1 -1
- package/lib/cjs/persisters/persister-electric-sql.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-expo-sqlite-next.cjs +1 -1
- package/lib/cjs/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-expo-sqlite.cjs +1 -1
- package/lib/cjs/persisters/persister-expo-sqlite.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-file.cjs +1 -1
- package/lib/cjs/persisters/persister-file.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-indexed-db.cjs +1 -1
- package/lib/cjs/persisters/persister-indexed-db.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-libsql.cjs +1 -0
- package/lib/cjs/persisters/persister-libsql.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-partykit-client.cjs +1 -1
- package/lib/cjs/persisters/persister-partykit-client.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-remote.cjs +1 -1
- package/lib/cjs/persisters/persister-remote.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -1
- package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-sqlite3.cjs +1 -1
- package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-yjs.cjs +1 -1
- package/lib/cjs/persisters/persister-yjs.cjs.gz +0 -0
- package/lib/cjs/persisters.cjs +1 -1
- package/lib/cjs/persisters.cjs.gz +0 -0
- package/lib/cjs/queries.cjs +1 -1
- package/lib/cjs/queries.cjs.gz +0 -0
- package/lib/cjs/relationships.cjs +1 -1
- package/lib/cjs/relationships.cjs.gz +0 -0
- package/lib/cjs/store.cjs +1 -1
- package/lib/cjs/store.cjs.gz +0 -0
- package/lib/cjs/tinybase.cjs +1 -1
- package/lib/cjs/tinybase.cjs.gz +0 -0
- package/lib/cjs/tools.cjs +1 -1
- package/lib/cjs/tools.cjs.gz +0 -0
- package/lib/cjs/ui-react-dom-debug.cjs +1 -1
- package/lib/cjs/ui-react-dom-debug.cjs.gz +0 -0
- package/lib/cjs-es6/checkpoints.cjs +1 -1
- package/lib/cjs-es6/checkpoints.cjs.gz +0 -0
- package/lib/cjs-es6/indexes.cjs +1 -1
- package/lib/cjs-es6/indexes.cjs.gz +0 -0
- package/lib/cjs-es6/mergeable-store.cjs +1 -1
- package/lib/cjs-es6/mergeable-store.cjs.gz +0 -0
- package/lib/cjs-es6/metrics.cjs +1 -1
- package/lib/cjs-es6/metrics.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-browser.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-browser.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-electric-sql.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-electric-sql.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-file.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-file.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-indexed-db.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-indexed-db.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-libsql.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-libsql.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-partykit-client.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-partykit-client.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-remote.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-remote.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
- package/lib/cjs-es6/persisters.cjs +1 -1
- package/lib/cjs-es6/persisters.cjs.gz +0 -0
- package/lib/cjs-es6/queries.cjs +1 -1
- package/lib/cjs-es6/queries.cjs.gz +0 -0
- package/lib/cjs-es6/relationships.cjs +1 -1
- package/lib/cjs-es6/relationships.cjs.gz +0 -0
- package/lib/cjs-es6/store.cjs +1 -1
- package/lib/cjs-es6/store.cjs.gz +0 -0
- package/lib/cjs-es6/tinybase.cjs +1 -1
- package/lib/cjs-es6/tinybase.cjs.gz +0 -0
- package/lib/cjs-es6/tools.cjs +1 -1
- package/lib/cjs-es6/tools.cjs.gz +0 -0
- package/lib/cjs-es6/ui-react-dom-debug.cjs +1 -1
- package/lib/cjs-es6/ui-react-dom-debug.cjs.gz +0 -0
- package/lib/debug/checkpoints.js +3 -1
- package/lib/debug/indexes.js +3 -1
- package/lib/debug/mergeable-store.js +196 -129
- package/lib/debug/metrics.js +3 -1
- package/lib/debug/persisters/persister-automerge.js +3 -1
- package/lib/debug/persisters/persister-browser.js +3 -1
- package/lib/debug/persisters/persister-cr-sqlite-wasm.js +3 -1
- package/lib/debug/persisters/persister-electric-sql.js +3 -1
- package/lib/debug/persisters/persister-expo-sqlite-next.js +3 -1
- package/lib/debug/persisters/persister-expo-sqlite.js +3 -1
- package/lib/debug/persisters/persister-file.js +3 -1
- package/lib/debug/persisters/persister-indexed-db.js +3 -1
- package/lib/debug/persisters/persister-libsql.js +898 -0
- package/lib/debug/persisters/persister-partykit-client.js +3 -1
- package/lib/debug/persisters/persister-remote.js +3 -1
- package/lib/debug/persisters/persister-sqlite-wasm.js +3 -1
- package/lib/debug/persisters/persister-sqlite3.js +3 -1
- package/lib/debug/persisters/persister-yjs.js +3 -1
- package/lib/debug/persisters.js +3 -1
- package/lib/debug/queries.js +7 -4
- package/lib/debug/relationships.js +3 -1
- package/lib/debug/store.js +7 -4
- package/lib/debug/tinybase.js +197 -130
- package/lib/debug/tools.js +7 -4
- package/lib/debug/ui-react-dom.js +7 -4
- package/lib/es6/checkpoints.js +1 -1
- package/lib/es6/checkpoints.js.gz +0 -0
- package/lib/es6/indexes.js +1 -1
- package/lib/es6/indexes.js.gz +0 -0
- package/lib/es6/mergeable-store.js +1 -1
- package/lib/es6/mergeable-store.js.gz +0 -0
- package/lib/es6/metrics.js +1 -1
- package/lib/es6/metrics.js.gz +0 -0
- package/lib/es6/persisters/persister-automerge.js +1 -1
- package/lib/es6/persisters/persister-automerge.js.gz +0 -0
- package/lib/es6/persisters/persister-browser.js +1 -1
- package/lib/es6/persisters/persister-browser.js.gz +0 -0
- package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -1
- package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/es6/persisters/persister-electric-sql.js +1 -1
- package/lib/es6/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/es6/persisters/persister-expo-sqlite-next.js +1 -1
- package/lib/es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
- package/lib/es6/persisters/persister-expo-sqlite.js +1 -1
- package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/es6/persisters/persister-file.js +1 -1
- package/lib/es6/persisters/persister-file.js.gz +0 -0
- package/lib/es6/persisters/persister-indexed-db.js +1 -1
- package/lib/es6/persisters/persister-indexed-db.js.gz +0 -0
- package/lib/es6/persisters/persister-libsql.js +1 -0
- package/lib/es6/persisters/persister-libsql.js.gz +0 -0
- package/lib/es6/persisters/persister-partykit-client.js +1 -1
- package/lib/es6/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/es6/persisters/persister-remote.js +1 -1
- package/lib/es6/persisters/persister-remote.js.gz +0 -0
- package/lib/es6/persisters/persister-sqlite-wasm.js +1 -1
- package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/es6/persisters/persister-sqlite3.js +1 -1
- package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/es6/persisters/persister-yjs.js +1 -1
- package/lib/es6/persisters/persister-yjs.js.gz +0 -0
- package/lib/es6/persisters.js +1 -1
- package/lib/es6/persisters.js.gz +0 -0
- package/lib/es6/queries.js +1 -1
- package/lib/es6/queries.js.gz +0 -0
- package/lib/es6/relationships.js +1 -1
- package/lib/es6/relationships.js.gz +0 -0
- package/lib/es6/store.js +1 -1
- package/lib/es6/store.js.gz +0 -0
- package/lib/es6/tinybase.js +1 -1
- package/lib/es6/tinybase.js.gz +0 -0
- package/lib/es6/tools.js +1 -1
- package/lib/es6/tools.js.gz +0 -0
- package/lib/es6/ui-react-dom-debug.js +1 -1
- package/lib/es6/ui-react-dom-debug.js.gz +0 -0
- package/lib/indexes.js +1 -1
- package/lib/indexes.js.gz +0 -0
- package/lib/mergeable-store.js +1 -1
- package/lib/mergeable-store.js.gz +0 -0
- package/lib/metrics.js +1 -1
- package/lib/metrics.js.gz +0 -0
- package/lib/persisters/persister-automerge.js +1 -1
- package/lib/persisters/persister-automerge.js.gz +0 -0
- package/lib/persisters/persister-browser.js +1 -1
- package/lib/persisters/persister-browser.js.gz +0 -0
- package/lib/persisters/persister-cr-sqlite-wasm.js +1 -1
- package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/persisters/persister-electric-sql.js +1 -1
- package/lib/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/persisters/persister-expo-sqlite-next.js +1 -1
- package/lib/persisters/persister-expo-sqlite-next.js.gz +0 -0
- package/lib/persisters/persister-expo-sqlite.js +1 -1
- package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/persisters/persister-file.js +1 -1
- package/lib/persisters/persister-file.js.gz +0 -0
- package/lib/persisters/persister-indexed-db.js +1 -1
- package/lib/persisters/persister-indexed-db.js.gz +0 -0
- package/lib/persisters/persister-libsql.js +1 -0
- package/lib/persisters/persister-libsql.js.gz +0 -0
- package/lib/persisters/persister-partykit-client.js +1 -1
- package/lib/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/persisters/persister-remote.js +1 -1
- package/lib/persisters/persister-remote.js.gz +0 -0
- package/lib/persisters/persister-sqlite-wasm.js +1 -1
- package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/persisters/persister-sqlite3.js +1 -1
- package/lib/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/persisters/persister-yjs.js +1 -1
- package/lib/persisters/persister-yjs.js.gz +0 -0
- package/lib/persisters.js +1 -1
- package/lib/persisters.js.gz +0 -0
- package/lib/queries.js +1 -1
- package/lib/queries.js.gz +0 -0
- package/lib/relationships.js +1 -1
- package/lib/relationships.js.gz +0 -0
- package/lib/store.js +1 -1
- package/lib/store.js.gz +0 -0
- package/lib/tinybase.js +1 -1
- package/lib/tinybase.js.gz +0 -0
- package/lib/tools.js +1 -1
- package/lib/tools.js.gz +0 -0
- package/lib/types/mergeable-store.d.ts +72 -11
- package/lib/types/persisters/persister-libsql.d.ts +139 -0
- package/lib/types/persisters.d.ts +1 -0
- package/lib/types/with-schemas/mergeable-store.d.ts +308 -31
- package/lib/types/with-schemas/persisters/persister-libsql.d.ts +152 -0
- package/lib/types/with-schemas/persisters.d.ts +1 -0
- package/lib/types/with-schemas/store.d.ts +37 -87
- package/lib/umd/checkpoints.js +1 -1
- package/lib/umd/checkpoints.js.gz +0 -0
- package/lib/umd/indexes.js +1 -1
- package/lib/umd/indexes.js.gz +0 -0
- package/lib/umd/mergeable-store.js +1 -1
- package/lib/umd/mergeable-store.js.gz +0 -0
- package/lib/umd/metrics.js +1 -1
- package/lib/umd/metrics.js.gz +0 -0
- package/lib/umd/persisters/persister-automerge.js +1 -1
- package/lib/umd/persisters/persister-automerge.js.gz +0 -0
- package/lib/umd/persisters/persister-browser.js +1 -1
- package/lib/umd/persisters/persister-browser.js.gz +0 -0
- package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -1
- package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/umd/persisters/persister-electric-sql.js +1 -1
- package/lib/umd/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/umd/persisters/persister-expo-sqlite-next.js +1 -1
- package/lib/umd/persisters/persister-expo-sqlite-next.js.gz +0 -0
- package/lib/umd/persisters/persister-expo-sqlite.js +1 -1
- package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/umd/persisters/persister-file.js +1 -1
- package/lib/umd/persisters/persister-file.js.gz +0 -0
- package/lib/umd/persisters/persister-indexed-db.js +1 -1
- package/lib/umd/persisters/persister-indexed-db.js.gz +0 -0
- package/lib/umd/persisters/persister-libsql.js +1 -0
- package/lib/umd/persisters/persister-libsql.js.gz +0 -0
- package/lib/umd/persisters/persister-partykit-client.js +1 -1
- package/lib/umd/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/umd/persisters/persister-remote.js +1 -1
- package/lib/umd/persisters/persister-remote.js.gz +0 -0
- package/lib/umd/persisters/persister-sqlite-wasm.js +1 -1
- package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/umd/persisters/persister-sqlite3.js +1 -1
- package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/umd/persisters/persister-yjs.js +1 -1
- package/lib/umd/persisters/persister-yjs.js.gz +0 -0
- package/lib/umd/persisters.js +1 -1
- package/lib/umd/persisters.js.gz +0 -0
- package/lib/umd/queries.js +1 -1
- package/lib/umd/queries.js.gz +0 -0
- package/lib/umd/relationships.js +1 -1
- package/lib/umd/relationships.js.gz +0 -0
- package/lib/umd/store.js +1 -1
- package/lib/umd/store.js.gz +0 -0
- package/lib/umd/tinybase.js +1 -1
- package/lib/umd/tinybase.js.gz +0 -0
- package/lib/umd/tools.js +1 -1
- package/lib/umd/tools.js.gz +0 -0
- package/lib/umd/ui-react-dom-debug.js +1 -1
- package/lib/umd/ui-react-dom-debug.js.gz +0 -0
- package/lib/umd-es6/checkpoints.js +1 -1
- package/lib/umd-es6/checkpoints.js.gz +0 -0
- package/lib/umd-es6/indexes.js +1 -1
- package/lib/umd-es6/indexes.js.gz +0 -0
- package/lib/umd-es6/mergeable-store.js +1 -1
- package/lib/umd-es6/mergeable-store.js.gz +0 -0
- package/lib/umd-es6/metrics.js +1 -1
- package/lib/umd-es6/metrics.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-automerge.js +1 -1
- package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-browser.js +1 -1
- package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -1
- package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-electric-sql.js +1 -1
- package/lib/umd-es6/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-expo-sqlite-next.js +1 -1
- package/lib/umd-es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -1
- package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-file.js +1 -1
- package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-indexed-db.js +1 -1
- package/lib/umd-es6/persisters/persister-indexed-db.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-libsql.js +1 -0
- package/lib/umd-es6/persisters/persister-libsql.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-partykit-client.js +1 -1
- package/lib/umd-es6/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-remote.js +1 -1
- package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -1
- package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-sqlite3.js +1 -1
- package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-yjs.js +1 -1
- package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
- package/lib/umd-es6/persisters.js +1 -1
- package/lib/umd-es6/persisters.js.gz +0 -0
- package/lib/umd-es6/queries.js +1 -1
- package/lib/umd-es6/queries.js.gz +0 -0
- package/lib/umd-es6/relationships.js +1 -1
- package/lib/umd-es6/relationships.js.gz +0 -0
- package/lib/umd-es6/store.js +1 -1
- package/lib/umd-es6/store.js.gz +0 -0
- package/lib/umd-es6/tinybase.js +1 -1
- package/lib/umd-es6/tinybase.js.gz +0 -0
- package/lib/umd-es6/tools.js +1 -1
- package/lib/umd-es6/tools.js.gz +0 -0
- package/lib/umd-es6/ui-react-dom-debug.js +1 -1
- package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
- package/package.json +34 -29
- package/readme.md +2 -2
|
@@ -24,8 +24,7 @@ const VALUE_IDS = VALUE + IDS;
|
|
|
24
24
|
const id = (key) => EMPTY_STRING + key;
|
|
25
25
|
const strStartsWith = (str, prefix) => str.startsWith(prefix);
|
|
26
26
|
const strEndsWith = (str, suffix) => str.endsWith(suffix);
|
|
27
|
-
const
|
|
28
|
-
const strCharCodeAt = (str, position = 0) => str.charCodeAt(position);
|
|
27
|
+
const strCharCodeAt = (str, position) => str.charCodeAt(position);
|
|
29
28
|
|
|
30
29
|
const mathMax = Math.max;
|
|
31
30
|
const isFiniteNumber = isFinite;
|
|
@@ -80,6 +79,12 @@ const objToArray = (obj, cb) =>
|
|
|
80
79
|
arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
|
|
81
80
|
const objSize = (obj) => size(objIds(obj));
|
|
82
81
|
const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
|
|
82
|
+
const objEnsure = (obj, id, getDefaultValue) => {
|
|
83
|
+
if (!objHas(obj, id)) {
|
|
84
|
+
obj[id] = getDefaultValue();
|
|
85
|
+
}
|
|
86
|
+
return obj[id];
|
|
87
|
+
};
|
|
83
88
|
|
|
84
89
|
const collSizeN = (collSizer) => (coll) =>
|
|
85
90
|
arrayReduce(collValues(coll), (total, coll2) => total + collSizer(coll2), 0);
|
|
@@ -103,9 +108,11 @@ const mapMap = (coll, cb) =>
|
|
|
103
108
|
arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
|
|
104
109
|
const mapSet = (map, key, value) =>
|
|
105
110
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
106
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
111
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
107
112
|
if (!collHas(map, key)) {
|
|
108
113
|
mapSet(map, key, getDefaultValue());
|
|
114
|
+
} else {
|
|
115
|
+
hadExistingValue?.(mapGet(map, key));
|
|
109
116
|
}
|
|
110
117
|
return mapGet(map, key);
|
|
111
118
|
};
|
|
@@ -163,36 +170,36 @@ const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
|
|
|
163
170
|
},
|
|
164
171
|
);
|
|
165
172
|
|
|
166
|
-
const
|
|
167
|
-
const
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
thingStamp[0] = newTime;
|
|
173
|
+
const textEncoder = new globalThis.TextEncoder();
|
|
174
|
+
const getHash = (value) => {
|
|
175
|
+
let hash = 2166136261;
|
|
176
|
+
arrayForEach(textEncoder.encode(value), (char) => {
|
|
177
|
+
hash ^= char;
|
|
178
|
+
hash +=
|
|
179
|
+
(hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);
|
|
180
|
+
});
|
|
181
|
+
return hash >>> 0;
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
const cloneHashStamp = ([time, value, hash]) => [time, value, hash];
|
|
185
|
+
const stampNew = (time, thing) => [time, thing];
|
|
186
|
+
const hashIdAndHash = (id, hash) => getHash(id + ':' + hash);
|
|
187
|
+
const updateHashStamp = (hashStamp, hash, time) => {
|
|
188
|
+
hashStamp[2] = hash >>> 0;
|
|
189
|
+
if (time > hashStamp[0]) {
|
|
190
|
+
hashStamp[0] = time;
|
|
185
191
|
}
|
|
186
|
-
merge(newThing, thingStamp[1], changes);
|
|
187
192
|
};
|
|
188
|
-
const
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
193
|
+
const stampNewObj = (time) => stampNew(time, objNew());
|
|
194
|
+
const hashStampNewMap = (time = EMPTY_STRING) => [time, mapNew(), 0];
|
|
195
|
+
const hashStampNewThing = () => [EMPTY_STRING, void 0, 0];
|
|
196
|
+
const hashStampMap = ([time, value, hash], mapper) => [
|
|
197
|
+
time,
|
|
198
|
+
mapper(value, time),
|
|
199
|
+
hash,
|
|
200
|
+
];
|
|
201
|
+
const hashStampMapToObj = (hashStamp, mapper = cloneHashStamp) =>
|
|
202
|
+
hashStampMap(hashStamp, (map) => mapToObj(map, mapper));
|
|
196
203
|
|
|
197
204
|
const setNew = (entryOrEntries) =>
|
|
198
205
|
new Set(
|
|
@@ -292,9 +299,10 @@ const pairNewMap = () => [mapNew(), mapNew()];
|
|
|
292
299
|
const pairClone = (array) => [...array];
|
|
293
300
|
const pairIsEqual = ([entry1, entry2]) => entry1 === entry2;
|
|
294
301
|
|
|
295
|
-
const getCellOrValueType = (
|
|
296
|
-
const type = getTypeOf(
|
|
297
|
-
return isTypeStringOrBoolean(type) ||
|
|
302
|
+
const getCellOrValueType = (cellOrValue) => {
|
|
303
|
+
const type = getTypeOf(cellOrValue);
|
|
304
|
+
return isTypeStringOrBoolean(type) ||
|
|
305
|
+
(type == NUMBER && isFiniteNumber(cellOrValue))
|
|
298
306
|
? type
|
|
299
307
|
: void 0;
|
|
300
308
|
};
|
|
@@ -1637,12 +1645,6 @@ const SHIFT12 = 2 ** 12;
|
|
|
1637
1645
|
const SHIFT6 = 2 ** 6;
|
|
1638
1646
|
const toB64 = (num) => String.fromCharCode(48 + (num & MASK6));
|
|
1639
1647
|
const fromB64 = (str, pos) => strCharCodeAt(str, pos) - 48;
|
|
1640
|
-
const hash = (value) =>
|
|
1641
|
-
arrayReduce(
|
|
1642
|
-
strSplit(value),
|
|
1643
|
-
(hash2, char) => ((hash2 << 5) + hash2) ^ strCharCodeAt(char),
|
|
1644
|
-
5381,
|
|
1645
|
-
) >>> 0;
|
|
1646
1648
|
const encodeHlc = (logicalTime42, counter24, clientHash30) =>
|
|
1647
1649
|
toB64(logicalTime42 / SHIFT36) +
|
|
1648
1650
|
toB64(logicalTime42 / SHIFT30) +
|
|
@@ -1681,7 +1683,7 @@ const decodeHlc = (hlc16) => [
|
|
|
1681
1683
|
const getHlcFunctions = (uniqueId) => {
|
|
1682
1684
|
let logicalTime = 0;
|
|
1683
1685
|
let lastCounter = -1;
|
|
1684
|
-
const uniqueIdHash =
|
|
1686
|
+
const uniqueIdHash = getHash(uniqueId);
|
|
1685
1687
|
const getHlc = () => {
|
|
1686
1688
|
seenHlc();
|
|
1687
1689
|
return encodeHlc(logicalTime, ++lastCounter, uniqueIdHash);
|
|
@@ -1722,15 +1724,16 @@ const LISTENER_ARGS = {
|
|
|
1722
1724
|
InvalidCell: 3,
|
|
1723
1725
|
InvalidValue: 1,
|
|
1724
1726
|
};
|
|
1725
|
-
const
|
|
1727
|
+
const newContentHsm = (time = EMPTY_STRING) => [
|
|
1726
1728
|
time,
|
|
1727
|
-
[
|
|
1729
|
+
[hashStampNewMap(time), hashStampNewMap(time)],
|
|
1730
|
+
0,
|
|
1728
1731
|
];
|
|
1729
1732
|
const createMergeableStore = (id) => {
|
|
1730
1733
|
let listening = 1;
|
|
1731
|
-
let
|
|
1734
|
+
let contentHsm = newContentHsm();
|
|
1732
1735
|
let transactionTime;
|
|
1733
|
-
let
|
|
1736
|
+
let transactionMergeableChanges;
|
|
1734
1737
|
const [getHlc, seenHlc] = getHlcFunctions(id);
|
|
1735
1738
|
const store = createStore();
|
|
1736
1739
|
const disableListening = (actions) => {
|
|
@@ -1739,68 +1742,134 @@ const createMergeableStore = (id) => {
|
|
|
1739
1742
|
actions();
|
|
1740
1743
|
listening = wasListening;
|
|
1741
1744
|
};
|
|
1742
|
-
const
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1745
|
+
const mergeContentOrChanges = (contentOrChanges, hasHashes = 0) => {
|
|
1746
|
+
const tablesChanges = {};
|
|
1747
|
+
const valuesChanges = {};
|
|
1748
|
+
const [
|
|
1749
|
+
contentOrChangesTime,
|
|
1750
|
+
[[tablesTime, tablesObj, incomingTablesHash], values],
|
|
1751
|
+
incomingContentOrChangesHash,
|
|
1752
|
+
] = contentOrChanges;
|
|
1753
|
+
const [, [tablesHsm, valuesHsm]] = contentHsm;
|
|
1754
|
+
const [oldTablesTime, tableHsms, oldTablesHash] = tablesHsm;
|
|
1755
|
+
if (tablesTime) {
|
|
1756
|
+
let tablesHash = hasHashes
|
|
1757
|
+
? incomingTablesHash
|
|
1758
|
+
: oldTablesHash ^
|
|
1759
|
+
(tablesTime > oldTablesTime
|
|
1760
|
+
? (oldTablesTime ? getHash(oldTablesTime) : 0) ^ getHash(tablesTime)
|
|
1761
|
+
: 0);
|
|
1762
|
+
objForEach(
|
|
1763
|
+
tablesObj,
|
|
1764
|
+
([tableTime, rowsObj, incomingTableHash], tableId) => {
|
|
1765
|
+
const tableHsm = mapEnsure(tableHsms, tableId, hashStampNewMap);
|
|
1766
|
+
const [oldTableTime, rowHsms, oldTableHash] = tableHsm;
|
|
1767
|
+
let tableHash = hasHashes
|
|
1768
|
+
? incomingTableHash
|
|
1769
|
+
: oldTableHash ^
|
|
1770
|
+
(tableTime > oldTableTime
|
|
1771
|
+
? (oldTableTime ? getHash(oldTableTime) : 0) ^
|
|
1772
|
+
getHash(tableTime)
|
|
1773
|
+
: 0);
|
|
1774
|
+
objForEach(rowsObj, (row, rowId) => {
|
|
1775
|
+
const [oldRowHash, rowHash] = mergeCellsOrValues(
|
|
1776
|
+
row,
|
|
1777
|
+
mapEnsure(rowHsms, rowId, hashStampNewMap),
|
|
1778
|
+
objEnsure(
|
|
1779
|
+
objEnsure(tablesChanges, tableId, objNew),
|
|
1780
|
+
rowId,
|
|
1781
|
+
objNew,
|
|
1782
|
+
),
|
|
1783
|
+
hasHashes,
|
|
1763
1784
|
);
|
|
1785
|
+
tableHash ^= hasHashes
|
|
1786
|
+
? 0
|
|
1787
|
+
: (oldRowHash ? hashIdAndHash(rowId, oldRowHash) : 0) ^
|
|
1788
|
+
hashIdAndHash(rowId, rowHash);
|
|
1764
1789
|
});
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1790
|
+
updateHashStamp(tableHsm, tableHash, tableTime);
|
|
1791
|
+
tablesHash ^= hasHashes
|
|
1792
|
+
? 0
|
|
1793
|
+
: (oldTableHash ? hashIdAndHash(tableId, oldTableHash) : 0) ^
|
|
1794
|
+
hashIdAndHash(tableId, tableHsm[2]);
|
|
1795
|
+
},
|
|
1796
|
+
);
|
|
1797
|
+
updateHashStamp(tablesHsm, tablesHash, tablesTime);
|
|
1773
1798
|
}
|
|
1799
|
+
mergeCellsOrValues(values, valuesHsm, valuesChanges, hasHashes);
|
|
1800
|
+
updateHashStamp(
|
|
1801
|
+
contentHsm,
|
|
1802
|
+
hasHashes ? incomingContentOrChangesHash : tablesHsm[2] ^ valuesHsm[2],
|
|
1803
|
+
contentOrChangesTime,
|
|
1804
|
+
);
|
|
1805
|
+
return [tablesChanges, valuesChanges];
|
|
1774
1806
|
};
|
|
1775
|
-
const
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
|
|
1807
|
+
const mergeCellsOrValues = (things, thingsHsm, thingsChanges, hasHashes) => {
|
|
1808
|
+
const [thingsTime, thingsObj, incomingThingsHash] = things;
|
|
1809
|
+
const [oldThingsTime, thingHsms, oldThingsHash] = thingsHsm;
|
|
1810
|
+
if (thingsTime) {
|
|
1811
|
+
let thingsHash = hasHashes
|
|
1812
|
+
? incomingThingsHash
|
|
1813
|
+
: oldThingsHash ^
|
|
1814
|
+
(thingsTime > oldThingsTime
|
|
1815
|
+
? (oldThingsTime ? getHash(oldThingsTime) : 0) ^ getHash(thingsTime)
|
|
1816
|
+
: 0);
|
|
1817
|
+
objForEach(
|
|
1818
|
+
thingsObj,
|
|
1819
|
+
([thingTime, thing, incomingThingHash], thingId) => {
|
|
1820
|
+
const thingHsm = mapEnsure(thingHsms, thingId, hashStampNewThing);
|
|
1821
|
+
const [oldThingTime, , oldThingHash] = thingHsm;
|
|
1822
|
+
if (thingTime > oldThingTime) {
|
|
1823
|
+
updateHashStamp(
|
|
1824
|
+
thingHsm,
|
|
1825
|
+
hasHashes
|
|
1826
|
+
? incomingThingHash
|
|
1827
|
+
: getHash(jsonString(thing ?? null) + ':' + thingTime),
|
|
1828
|
+
thingTime,
|
|
1829
|
+
);
|
|
1830
|
+
thingHsm[1] = thing;
|
|
1831
|
+
thingsChanges[thingId] = thing;
|
|
1832
|
+
thingsHash ^= hasHashes
|
|
1833
|
+
? 0
|
|
1834
|
+
: hashIdAndHash(thingId, oldThingHash) ^
|
|
1835
|
+
hashIdAndHash(thingId, thingHsm[2]);
|
|
1836
|
+
}
|
|
1837
|
+
},
|
|
1838
|
+
);
|
|
1839
|
+
updateHashStamp(thingsHsm, thingsHash, thingsTime);
|
|
1840
|
+
}
|
|
1841
|
+
return [oldThingsHash, thingsHsm[2]];
|
|
1782
1842
|
};
|
|
1843
|
+
const preFinishTransaction = () => {
|
|
1844
|
+
if (listening) {
|
|
1845
|
+
transactionMergeableChanges = getTransactionMergeableChanges();
|
|
1846
|
+
mergeContentOrChanges(transactionMergeableChanges);
|
|
1847
|
+
}
|
|
1848
|
+
};
|
|
1849
|
+
const postFinishTransaction = () =>
|
|
1850
|
+
(transactionTime = transactionMergeableChanges = void 0);
|
|
1783
1851
|
const getMergeableContent = () =>
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
1787
|
-
mapStampMapToObj(cellsStamp, cloneStamp),
|
|
1788
|
-
),
|
|
1852
|
+
hashStampMap(contentHsm, ([tables, values]) => [
|
|
1853
|
+
hashStampMapToObj(tables, (table) =>
|
|
1854
|
+
hashStampMapToObj(table, (row) => hashStampMapToObj(row)),
|
|
1789
1855
|
),
|
|
1790
|
-
|
|
1856
|
+
hashStampMapToObj(values),
|
|
1791
1857
|
]);
|
|
1792
1858
|
const setMergeableContent = (mergeableContent) => {
|
|
1793
1859
|
disableListening(() =>
|
|
1794
1860
|
store.transaction(() => {
|
|
1795
1861
|
store.delTables().delValues();
|
|
1796
|
-
|
|
1862
|
+
contentHsm = newContentHsm();
|
|
1797
1863
|
}),
|
|
1798
1864
|
);
|
|
1799
|
-
|
|
1865
|
+
seenHlc(mergeableContent[0]);
|
|
1866
|
+
disableListening(() =>
|
|
1867
|
+
store.applyChanges(mergeContentOrChanges(mergeableContent, 1)),
|
|
1868
|
+
);
|
|
1800
1869
|
return mergeableStore;
|
|
1801
1870
|
};
|
|
1802
1871
|
const getTransactionMergeableChanges = () => {
|
|
1803
|
-
if (isUndefined(
|
|
1872
|
+
if (isUndefined(transactionMergeableChanges)) {
|
|
1804
1873
|
const [, , changedCells, , changedValues] = store.getTransactionLog();
|
|
1805
1874
|
const time =
|
|
1806
1875
|
!objIsEmpty(changedCells) || !objIsEmpty(changedValues)
|
|
@@ -1810,69 +1879,67 @@ const createMergeableStore = (id) => {
|
|
|
1810
1879
|
stampNewObj(objIsEmpty(changedCells) ? EMPTY_STRING : time),
|
|
1811
1880
|
stampNewObj(objIsEmpty(changedValues) ? EMPTY_STRING : time),
|
|
1812
1881
|
]);
|
|
1813
|
-
const [[,
|
|
1882
|
+
const [[, tablesObj], [, valuesObj]] = mergeableChanges[1];
|
|
1814
1883
|
objToArray(changedCells, (changedTable, tableId) => {
|
|
1815
|
-
const [,
|
|
1884
|
+
const [, rowsObj] = (tablesObj[tableId] = stampNewObj(time));
|
|
1816
1885
|
objToArray(changedTable, (changedRow, rowId) => {
|
|
1817
|
-
const [,
|
|
1886
|
+
const [, cellsObj] = (rowsObj[rowId] = stampNewObj(time));
|
|
1818
1887
|
objToArray(
|
|
1819
1888
|
changedRow,
|
|
1820
1889
|
([, newCell], cellId) =>
|
|
1821
|
-
(
|
|
1890
|
+
(cellsObj[cellId] = stampNew(time, newCell)),
|
|
1822
1891
|
);
|
|
1823
1892
|
});
|
|
1824
1893
|
});
|
|
1825
1894
|
objToArray(
|
|
1826
1895
|
changedValues,
|
|
1827
1896
|
([, newValue], valueId) =>
|
|
1828
|
-
(
|
|
1897
|
+
(valuesObj[valueId] = stampNew(time, newValue)),
|
|
1829
1898
|
);
|
|
1830
1899
|
return mergeableChanges;
|
|
1831
1900
|
}
|
|
1832
|
-
return
|
|
1901
|
+
return transactionMergeableChanges;
|
|
1833
1902
|
};
|
|
1834
|
-
const applyMergeableChanges = (
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
newContentStamp2,
|
|
1839
|
-
contentStamp,
|
|
1840
|
-
changes,
|
|
1841
|
-
(
|
|
1842
|
-
[newTablesStamp, newValuesStamp],
|
|
1843
|
-
[tablesStamp, valuesStamp],
|
|
1844
|
-
[tablesChanges, valuesChanges],
|
|
1845
|
-
) => {
|
|
1846
|
-
mergeStamp(
|
|
1847
|
-
newTablesStamp,
|
|
1848
|
-
tablesStamp,
|
|
1849
|
-
tablesChanges,
|
|
1850
|
-
(newTableStamps, tableStamps, tableChanges) =>
|
|
1851
|
-
mergeStamps(
|
|
1852
|
-
newTableStamps,
|
|
1853
|
-
tableStamps,
|
|
1854
|
-
tableChanges,
|
|
1855
|
-
(newRowStamps, rowStamps, rowChanges) =>
|
|
1856
|
-
mergeStamps(
|
|
1857
|
-
newRowStamps,
|
|
1858
|
-
rowStamps,
|
|
1859
|
-
rowChanges,
|
|
1860
|
-
mergeLeafStamps,
|
|
1861
|
-
),
|
|
1862
|
-
),
|
|
1863
|
-
);
|
|
1864
|
-
mergeStamp(newValuesStamp, valuesStamp, valuesChanges, mergeLeafStamps);
|
|
1865
|
-
},
|
|
1903
|
+
const applyMergeableChanges = (mergeableChanges) => {
|
|
1904
|
+
seenHlc(mergeableChanges[0]);
|
|
1905
|
+
disableListening(() =>
|
|
1906
|
+
store.applyChanges(mergeContentOrChanges(mergeableChanges)),
|
|
1866
1907
|
);
|
|
1867
|
-
disableListening(() => store.applyChanges(changes));
|
|
1868
1908
|
return mergeableStore;
|
|
1869
1909
|
};
|
|
1910
|
+
const merge = (mergeableStore2) => {
|
|
1911
|
+
const mergeableChanges = getMergeableContent();
|
|
1912
|
+
const mergeableChanges2 = mergeableStore2.getMergeableContent();
|
|
1913
|
+
mergeableStore2.applyMergeableChanges(mergeableChanges);
|
|
1914
|
+
return applyMergeableChanges(mergeableChanges2);
|
|
1915
|
+
};
|
|
1916
|
+
const getContentHash = () => contentHsm[2];
|
|
1917
|
+
const getTablesHash = () => contentHsm[1][0][2];
|
|
1918
|
+
const getTableHash = (tableId) =>
|
|
1919
|
+
mapGet(contentHsm[1][0][1], tableId)?.[2] ?? 0;
|
|
1920
|
+
const getRowHash = (tableId, rowId) =>
|
|
1921
|
+
mapGet(mapGet(contentHsm[1][0][1], tableId)?.[1], rowId)?.[2] ?? 0;
|
|
1922
|
+
const getCellHash = (tableId, rowId, cellId) =>
|
|
1923
|
+
mapGet(
|
|
1924
|
+
mapGet(mapGet(contentHsm[1][0][1], tableId)?.[1], rowId)?.[1],
|
|
1925
|
+
cellId,
|
|
1926
|
+
)?.[2] ?? 0;
|
|
1927
|
+
const getValuesHash = () => contentHsm[1][1][2];
|
|
1928
|
+
const getValueHash = (valueId) =>
|
|
1929
|
+
mapGet(contentHsm[1][1][1], valueId)?.[2] ?? 0;
|
|
1870
1930
|
const mergeableStore = {
|
|
1871
1931
|
getMergeableContent,
|
|
1872
1932
|
setMergeableContent,
|
|
1873
1933
|
getTransactionMergeableChanges,
|
|
1874
1934
|
applyMergeableChanges,
|
|
1875
1935
|
merge,
|
|
1936
|
+
getContentHash,
|
|
1937
|
+
getTablesHash,
|
|
1938
|
+
getTableHash,
|
|
1939
|
+
getRowHash,
|
|
1940
|
+
getCellHash,
|
|
1941
|
+
getValuesHash,
|
|
1942
|
+
getValueHash,
|
|
1876
1943
|
};
|
|
1877
1944
|
store.setInternalListeners(preFinishTransaction, postFinishTransaction);
|
|
1878
1945
|
objToArray(
|
package/lib/debug/metrics.js
CHANGED
|
@@ -52,9 +52,11 @@ const mapForEach = (map, cb) =>
|
|
|
52
52
|
collForEach(map, (value, key) => cb(key, value));
|
|
53
53
|
const mapSet = (map, key, value) =>
|
|
54
54
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
55
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
55
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
56
56
|
if (!collHas(map, key)) {
|
|
57
57
|
mapSet(map, key, getDefaultValue());
|
|
58
|
+
} else {
|
|
59
|
+
hadExistingValue?.(mapGet(map, key));
|
|
58
60
|
}
|
|
59
61
|
return mapGet(map, key);
|
|
60
62
|
};
|
|
@@ -52,9 +52,11 @@ const mapNew = (entries) => new Map(entries);
|
|
|
52
52
|
const mapGet = (map, key) => map?.get(key);
|
|
53
53
|
const mapSet = (map, key, value) =>
|
|
54
54
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
55
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
55
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
56
56
|
if (!collHas(map, key)) {
|
|
57
57
|
mapSet(map, key, getDefaultValue());
|
|
58
|
+
} else {
|
|
59
|
+
hadExistingValue?.(mapGet(map, key));
|
|
58
60
|
}
|
|
59
61
|
return mapGet(map, key);
|
|
60
62
|
};
|
|
@@ -42,9 +42,11 @@ const mapNew = (entries) => new Map(entries);
|
|
|
42
42
|
const mapGet = (map, key) => map?.get(key);
|
|
43
43
|
const mapSet = (map, key, value) =>
|
|
44
44
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
45
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
45
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
46
46
|
if (!collHas(map, key)) {
|
|
47
47
|
mapSet(map, key, getDefaultValue());
|
|
48
|
+
} else {
|
|
49
|
+
hadExistingValue?.(mapGet(map, key));
|
|
48
50
|
}
|
|
49
51
|
return mapGet(map, key);
|
|
50
52
|
};
|
|
@@ -75,9 +75,11 @@ const mapMap = (coll, cb) =>
|
|
|
75
75
|
arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
|
|
76
76
|
const mapSet = (map, key, value) =>
|
|
77
77
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
78
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
78
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
79
79
|
if (!collHas(map, key)) {
|
|
80
80
|
mapSet(map, key, getDefaultValue());
|
|
81
|
+
} else {
|
|
82
|
+
hadExistingValue?.(mapGet(map, key));
|
|
81
83
|
}
|
|
82
84
|
return mapGet(map, key);
|
|
83
85
|
};
|
|
@@ -76,9 +76,11 @@ const mapMap = (coll, cb) =>
|
|
|
76
76
|
arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
|
|
77
77
|
const mapSet = (map, key, value) =>
|
|
78
78
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
79
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
79
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
80
80
|
if (!collHas(map, key)) {
|
|
81
81
|
mapSet(map, key, getDefaultValue());
|
|
82
|
+
} else {
|
|
83
|
+
hadExistingValue?.(mapGet(map, key));
|
|
82
84
|
}
|
|
83
85
|
return mapGet(map, key);
|
|
84
86
|
};
|
|
@@ -77,9 +77,11 @@ const mapMap = (coll, cb) =>
|
|
|
77
77
|
arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
|
|
78
78
|
const mapSet = (map, key, value) =>
|
|
79
79
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
80
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
80
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
81
81
|
if (!collHas(map, key)) {
|
|
82
82
|
mapSet(map, key, getDefaultValue());
|
|
83
|
+
} else {
|
|
84
|
+
hadExistingValue?.(mapGet(map, key));
|
|
83
85
|
}
|
|
84
86
|
return mapGet(map, key);
|
|
85
87
|
};
|
|
@@ -75,9 +75,11 @@ const mapMap = (coll, cb) =>
|
|
|
75
75
|
arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
|
|
76
76
|
const mapSet = (map, key, value) =>
|
|
77
77
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
78
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
78
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
79
79
|
if (!collHas(map, key)) {
|
|
80
80
|
mapSet(map, key, getDefaultValue());
|
|
81
|
+
} else {
|
|
82
|
+
hadExistingValue?.(mapGet(map, key));
|
|
81
83
|
}
|
|
82
84
|
return mapGet(map, key);
|
|
83
85
|
};
|
|
@@ -46,9 +46,11 @@ const mapNew = (entries) => new Map(entries);
|
|
|
46
46
|
const mapGet = (map, key) => map?.get(key);
|
|
47
47
|
const mapSet = (map, key, value) =>
|
|
48
48
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
49
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
49
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
50
50
|
if (!collHas(map, key)) {
|
|
51
51
|
mapSet(map, key, getDefaultValue());
|
|
52
|
+
} else {
|
|
53
|
+
hadExistingValue?.(mapGet(map, key));
|
|
52
54
|
}
|
|
53
55
|
return mapGet(map, key);
|
|
54
56
|
};
|
|
@@ -51,9 +51,11 @@ const mapNew = (entries) => new Map(entries);
|
|
|
51
51
|
const mapGet = (map, key) => map?.get(key);
|
|
52
52
|
const mapSet = (map, key, value) =>
|
|
53
53
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
54
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
54
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
55
55
|
if (!collHas(map, key)) {
|
|
56
56
|
mapSet(map, key, getDefaultValue());
|
|
57
|
+
} else {
|
|
58
|
+
hadExistingValue?.(mapGet(map, key));
|
|
57
59
|
}
|
|
58
60
|
return mapGet(map, key);
|
|
59
61
|
};
|