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.
Files changed (332) hide show
  1. package/lib/checkpoints.js +1 -1
  2. package/lib/checkpoints.js.gz +0 -0
  3. package/lib/cjs/checkpoints.cjs +1 -1
  4. package/lib/cjs/checkpoints.cjs.gz +0 -0
  5. package/lib/cjs/indexes.cjs +1 -1
  6. package/lib/cjs/indexes.cjs.gz +0 -0
  7. package/lib/cjs/mergeable-store.cjs +1 -1
  8. package/lib/cjs/mergeable-store.cjs.gz +0 -0
  9. package/lib/cjs/metrics.cjs +1 -1
  10. package/lib/cjs/metrics.cjs.gz +0 -0
  11. package/lib/cjs/persisters/persister-automerge.cjs +1 -1
  12. package/lib/cjs/persisters/persister-automerge.cjs.gz +0 -0
  13. package/lib/cjs/persisters/persister-browser.cjs +1 -1
  14. package/lib/cjs/persisters/persister-browser.cjs.gz +0 -0
  15. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  16. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  17. package/lib/cjs/persisters/persister-electric-sql.cjs +1 -1
  18. package/lib/cjs/persisters/persister-electric-sql.cjs.gz +0 -0
  19. package/lib/cjs/persisters/persister-expo-sqlite-next.cjs +1 -1
  20. package/lib/cjs/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  21. package/lib/cjs/persisters/persister-expo-sqlite.cjs +1 -1
  22. package/lib/cjs/persisters/persister-expo-sqlite.cjs.gz +0 -0
  23. package/lib/cjs/persisters/persister-file.cjs +1 -1
  24. package/lib/cjs/persisters/persister-file.cjs.gz +0 -0
  25. package/lib/cjs/persisters/persister-indexed-db.cjs +1 -1
  26. package/lib/cjs/persisters/persister-indexed-db.cjs.gz +0 -0
  27. package/lib/cjs/persisters/persister-libsql.cjs +1 -0
  28. package/lib/cjs/persisters/persister-libsql.cjs.gz +0 -0
  29. package/lib/cjs/persisters/persister-partykit-client.cjs +1 -1
  30. package/lib/cjs/persisters/persister-partykit-client.cjs.gz +0 -0
  31. package/lib/cjs/persisters/persister-remote.cjs +1 -1
  32. package/lib/cjs/persisters/persister-remote.cjs.gz +0 -0
  33. package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -1
  34. package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  35. package/lib/cjs/persisters/persister-sqlite3.cjs +1 -1
  36. package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
  37. package/lib/cjs/persisters/persister-yjs.cjs +1 -1
  38. package/lib/cjs/persisters/persister-yjs.cjs.gz +0 -0
  39. package/lib/cjs/persisters.cjs +1 -1
  40. package/lib/cjs/persisters.cjs.gz +0 -0
  41. package/lib/cjs/queries.cjs +1 -1
  42. package/lib/cjs/queries.cjs.gz +0 -0
  43. package/lib/cjs/relationships.cjs +1 -1
  44. package/lib/cjs/relationships.cjs.gz +0 -0
  45. package/lib/cjs/store.cjs +1 -1
  46. package/lib/cjs/store.cjs.gz +0 -0
  47. package/lib/cjs/tinybase.cjs +1 -1
  48. package/lib/cjs/tinybase.cjs.gz +0 -0
  49. package/lib/cjs/tools.cjs +1 -1
  50. package/lib/cjs/tools.cjs.gz +0 -0
  51. package/lib/cjs/ui-react-dom-debug.cjs +1 -1
  52. package/lib/cjs/ui-react-dom-debug.cjs.gz +0 -0
  53. package/lib/cjs-es6/checkpoints.cjs +1 -1
  54. package/lib/cjs-es6/checkpoints.cjs.gz +0 -0
  55. package/lib/cjs-es6/indexes.cjs +1 -1
  56. package/lib/cjs-es6/indexes.cjs.gz +0 -0
  57. package/lib/cjs-es6/mergeable-store.cjs +1 -1
  58. package/lib/cjs-es6/mergeable-store.cjs.gz +0 -0
  59. package/lib/cjs-es6/metrics.cjs +1 -1
  60. package/lib/cjs-es6/metrics.cjs.gz +0 -0
  61. package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -1
  62. package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
  63. package/lib/cjs-es6/persisters/persister-browser.cjs +1 -1
  64. package/lib/cjs-es6/persisters/persister-browser.cjs.gz +0 -0
  65. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  66. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  67. package/lib/cjs-es6/persisters/persister-electric-sql.cjs +1 -1
  68. package/lib/cjs-es6/persisters/persister-electric-sql.cjs.gz +0 -0
  69. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs +1 -1
  70. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  71. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs +1 -1
  72. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
  73. package/lib/cjs-es6/persisters/persister-file.cjs +1 -1
  74. package/lib/cjs-es6/persisters/persister-file.cjs.gz +0 -0
  75. package/lib/cjs-es6/persisters/persister-indexed-db.cjs +1 -1
  76. package/lib/cjs-es6/persisters/persister-indexed-db.cjs.gz +0 -0
  77. package/lib/cjs-es6/persisters/persister-libsql.cjs +1 -0
  78. package/lib/cjs-es6/persisters/persister-libsql.cjs.gz +0 -0
  79. package/lib/cjs-es6/persisters/persister-partykit-client.cjs +1 -1
  80. package/lib/cjs-es6/persisters/persister-partykit-client.cjs.gz +0 -0
  81. package/lib/cjs-es6/persisters/persister-remote.cjs +1 -1
  82. package/lib/cjs-es6/persisters/persister-remote.cjs.gz +0 -0
  83. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -1
  84. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  85. package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -1
  86. package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
  87. package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -1
  88. package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
  89. package/lib/cjs-es6/persisters.cjs +1 -1
  90. package/lib/cjs-es6/persisters.cjs.gz +0 -0
  91. package/lib/cjs-es6/queries.cjs +1 -1
  92. package/lib/cjs-es6/queries.cjs.gz +0 -0
  93. package/lib/cjs-es6/relationships.cjs +1 -1
  94. package/lib/cjs-es6/relationships.cjs.gz +0 -0
  95. package/lib/cjs-es6/store.cjs +1 -1
  96. package/lib/cjs-es6/store.cjs.gz +0 -0
  97. package/lib/cjs-es6/tinybase.cjs +1 -1
  98. package/lib/cjs-es6/tinybase.cjs.gz +0 -0
  99. package/lib/cjs-es6/tools.cjs +1 -1
  100. package/lib/cjs-es6/tools.cjs.gz +0 -0
  101. package/lib/cjs-es6/ui-react-dom-debug.cjs +1 -1
  102. package/lib/cjs-es6/ui-react-dom-debug.cjs.gz +0 -0
  103. package/lib/debug/checkpoints.js +3 -1
  104. package/lib/debug/indexes.js +3 -1
  105. package/lib/debug/mergeable-store.js +196 -129
  106. package/lib/debug/metrics.js +3 -1
  107. package/lib/debug/persisters/persister-automerge.js +3 -1
  108. package/lib/debug/persisters/persister-browser.js +3 -1
  109. package/lib/debug/persisters/persister-cr-sqlite-wasm.js +3 -1
  110. package/lib/debug/persisters/persister-electric-sql.js +3 -1
  111. package/lib/debug/persisters/persister-expo-sqlite-next.js +3 -1
  112. package/lib/debug/persisters/persister-expo-sqlite.js +3 -1
  113. package/lib/debug/persisters/persister-file.js +3 -1
  114. package/lib/debug/persisters/persister-indexed-db.js +3 -1
  115. package/lib/debug/persisters/persister-libsql.js +898 -0
  116. package/lib/debug/persisters/persister-partykit-client.js +3 -1
  117. package/lib/debug/persisters/persister-remote.js +3 -1
  118. package/lib/debug/persisters/persister-sqlite-wasm.js +3 -1
  119. package/lib/debug/persisters/persister-sqlite3.js +3 -1
  120. package/lib/debug/persisters/persister-yjs.js +3 -1
  121. package/lib/debug/persisters.js +3 -1
  122. package/lib/debug/queries.js +7 -4
  123. package/lib/debug/relationships.js +3 -1
  124. package/lib/debug/store.js +7 -4
  125. package/lib/debug/tinybase.js +197 -130
  126. package/lib/debug/tools.js +7 -4
  127. package/lib/debug/ui-react-dom.js +7 -4
  128. package/lib/es6/checkpoints.js +1 -1
  129. package/lib/es6/checkpoints.js.gz +0 -0
  130. package/lib/es6/indexes.js +1 -1
  131. package/lib/es6/indexes.js.gz +0 -0
  132. package/lib/es6/mergeable-store.js +1 -1
  133. package/lib/es6/mergeable-store.js.gz +0 -0
  134. package/lib/es6/metrics.js +1 -1
  135. package/lib/es6/metrics.js.gz +0 -0
  136. package/lib/es6/persisters/persister-automerge.js +1 -1
  137. package/lib/es6/persisters/persister-automerge.js.gz +0 -0
  138. package/lib/es6/persisters/persister-browser.js +1 -1
  139. package/lib/es6/persisters/persister-browser.js.gz +0 -0
  140. package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  141. package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  142. package/lib/es6/persisters/persister-electric-sql.js +1 -1
  143. package/lib/es6/persisters/persister-electric-sql.js.gz +0 -0
  144. package/lib/es6/persisters/persister-expo-sqlite-next.js +1 -1
  145. package/lib/es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  146. package/lib/es6/persisters/persister-expo-sqlite.js +1 -1
  147. package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
  148. package/lib/es6/persisters/persister-file.js +1 -1
  149. package/lib/es6/persisters/persister-file.js.gz +0 -0
  150. package/lib/es6/persisters/persister-indexed-db.js +1 -1
  151. package/lib/es6/persisters/persister-indexed-db.js.gz +0 -0
  152. package/lib/es6/persisters/persister-libsql.js +1 -0
  153. package/lib/es6/persisters/persister-libsql.js.gz +0 -0
  154. package/lib/es6/persisters/persister-partykit-client.js +1 -1
  155. package/lib/es6/persisters/persister-partykit-client.js.gz +0 -0
  156. package/lib/es6/persisters/persister-remote.js +1 -1
  157. package/lib/es6/persisters/persister-remote.js.gz +0 -0
  158. package/lib/es6/persisters/persister-sqlite-wasm.js +1 -1
  159. package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  160. package/lib/es6/persisters/persister-sqlite3.js +1 -1
  161. package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
  162. package/lib/es6/persisters/persister-yjs.js +1 -1
  163. package/lib/es6/persisters/persister-yjs.js.gz +0 -0
  164. package/lib/es6/persisters.js +1 -1
  165. package/lib/es6/persisters.js.gz +0 -0
  166. package/lib/es6/queries.js +1 -1
  167. package/lib/es6/queries.js.gz +0 -0
  168. package/lib/es6/relationships.js +1 -1
  169. package/lib/es6/relationships.js.gz +0 -0
  170. package/lib/es6/store.js +1 -1
  171. package/lib/es6/store.js.gz +0 -0
  172. package/lib/es6/tinybase.js +1 -1
  173. package/lib/es6/tinybase.js.gz +0 -0
  174. package/lib/es6/tools.js +1 -1
  175. package/lib/es6/tools.js.gz +0 -0
  176. package/lib/es6/ui-react-dom-debug.js +1 -1
  177. package/lib/es6/ui-react-dom-debug.js.gz +0 -0
  178. package/lib/indexes.js +1 -1
  179. package/lib/indexes.js.gz +0 -0
  180. package/lib/mergeable-store.js +1 -1
  181. package/lib/mergeable-store.js.gz +0 -0
  182. package/lib/metrics.js +1 -1
  183. package/lib/metrics.js.gz +0 -0
  184. package/lib/persisters/persister-automerge.js +1 -1
  185. package/lib/persisters/persister-automerge.js.gz +0 -0
  186. package/lib/persisters/persister-browser.js +1 -1
  187. package/lib/persisters/persister-browser.js.gz +0 -0
  188. package/lib/persisters/persister-cr-sqlite-wasm.js +1 -1
  189. package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  190. package/lib/persisters/persister-electric-sql.js +1 -1
  191. package/lib/persisters/persister-electric-sql.js.gz +0 -0
  192. package/lib/persisters/persister-expo-sqlite-next.js +1 -1
  193. package/lib/persisters/persister-expo-sqlite-next.js.gz +0 -0
  194. package/lib/persisters/persister-expo-sqlite.js +1 -1
  195. package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
  196. package/lib/persisters/persister-file.js +1 -1
  197. package/lib/persisters/persister-file.js.gz +0 -0
  198. package/lib/persisters/persister-indexed-db.js +1 -1
  199. package/lib/persisters/persister-indexed-db.js.gz +0 -0
  200. package/lib/persisters/persister-libsql.js +1 -0
  201. package/lib/persisters/persister-libsql.js.gz +0 -0
  202. package/lib/persisters/persister-partykit-client.js +1 -1
  203. package/lib/persisters/persister-partykit-client.js.gz +0 -0
  204. package/lib/persisters/persister-remote.js +1 -1
  205. package/lib/persisters/persister-remote.js.gz +0 -0
  206. package/lib/persisters/persister-sqlite-wasm.js +1 -1
  207. package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
  208. package/lib/persisters/persister-sqlite3.js +1 -1
  209. package/lib/persisters/persister-sqlite3.js.gz +0 -0
  210. package/lib/persisters/persister-yjs.js +1 -1
  211. package/lib/persisters/persister-yjs.js.gz +0 -0
  212. package/lib/persisters.js +1 -1
  213. package/lib/persisters.js.gz +0 -0
  214. package/lib/queries.js +1 -1
  215. package/lib/queries.js.gz +0 -0
  216. package/lib/relationships.js +1 -1
  217. package/lib/relationships.js.gz +0 -0
  218. package/lib/store.js +1 -1
  219. package/lib/store.js.gz +0 -0
  220. package/lib/tinybase.js +1 -1
  221. package/lib/tinybase.js.gz +0 -0
  222. package/lib/tools.js +1 -1
  223. package/lib/tools.js.gz +0 -0
  224. package/lib/types/mergeable-store.d.ts +72 -11
  225. package/lib/types/persisters/persister-libsql.d.ts +139 -0
  226. package/lib/types/persisters.d.ts +1 -0
  227. package/lib/types/with-schemas/mergeable-store.d.ts +308 -31
  228. package/lib/types/with-schemas/persisters/persister-libsql.d.ts +152 -0
  229. package/lib/types/with-schemas/persisters.d.ts +1 -0
  230. package/lib/types/with-schemas/store.d.ts +37 -87
  231. package/lib/umd/checkpoints.js +1 -1
  232. package/lib/umd/checkpoints.js.gz +0 -0
  233. package/lib/umd/indexes.js +1 -1
  234. package/lib/umd/indexes.js.gz +0 -0
  235. package/lib/umd/mergeable-store.js +1 -1
  236. package/lib/umd/mergeable-store.js.gz +0 -0
  237. package/lib/umd/metrics.js +1 -1
  238. package/lib/umd/metrics.js.gz +0 -0
  239. package/lib/umd/persisters/persister-automerge.js +1 -1
  240. package/lib/umd/persisters/persister-automerge.js.gz +0 -0
  241. package/lib/umd/persisters/persister-browser.js +1 -1
  242. package/lib/umd/persisters/persister-browser.js.gz +0 -0
  243. package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -1
  244. package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  245. package/lib/umd/persisters/persister-electric-sql.js +1 -1
  246. package/lib/umd/persisters/persister-electric-sql.js.gz +0 -0
  247. package/lib/umd/persisters/persister-expo-sqlite-next.js +1 -1
  248. package/lib/umd/persisters/persister-expo-sqlite-next.js.gz +0 -0
  249. package/lib/umd/persisters/persister-expo-sqlite.js +1 -1
  250. package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
  251. package/lib/umd/persisters/persister-file.js +1 -1
  252. package/lib/umd/persisters/persister-file.js.gz +0 -0
  253. package/lib/umd/persisters/persister-indexed-db.js +1 -1
  254. package/lib/umd/persisters/persister-indexed-db.js.gz +0 -0
  255. package/lib/umd/persisters/persister-libsql.js +1 -0
  256. package/lib/umd/persisters/persister-libsql.js.gz +0 -0
  257. package/lib/umd/persisters/persister-partykit-client.js +1 -1
  258. package/lib/umd/persisters/persister-partykit-client.js.gz +0 -0
  259. package/lib/umd/persisters/persister-remote.js +1 -1
  260. package/lib/umd/persisters/persister-remote.js.gz +0 -0
  261. package/lib/umd/persisters/persister-sqlite-wasm.js +1 -1
  262. package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
  263. package/lib/umd/persisters/persister-sqlite3.js +1 -1
  264. package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
  265. package/lib/umd/persisters/persister-yjs.js +1 -1
  266. package/lib/umd/persisters/persister-yjs.js.gz +0 -0
  267. package/lib/umd/persisters.js +1 -1
  268. package/lib/umd/persisters.js.gz +0 -0
  269. package/lib/umd/queries.js +1 -1
  270. package/lib/umd/queries.js.gz +0 -0
  271. package/lib/umd/relationships.js +1 -1
  272. package/lib/umd/relationships.js.gz +0 -0
  273. package/lib/umd/store.js +1 -1
  274. package/lib/umd/store.js.gz +0 -0
  275. package/lib/umd/tinybase.js +1 -1
  276. package/lib/umd/tinybase.js.gz +0 -0
  277. package/lib/umd/tools.js +1 -1
  278. package/lib/umd/tools.js.gz +0 -0
  279. package/lib/umd/ui-react-dom-debug.js +1 -1
  280. package/lib/umd/ui-react-dom-debug.js.gz +0 -0
  281. package/lib/umd-es6/checkpoints.js +1 -1
  282. package/lib/umd-es6/checkpoints.js.gz +0 -0
  283. package/lib/umd-es6/indexes.js +1 -1
  284. package/lib/umd-es6/indexes.js.gz +0 -0
  285. package/lib/umd-es6/mergeable-store.js +1 -1
  286. package/lib/umd-es6/mergeable-store.js.gz +0 -0
  287. package/lib/umd-es6/metrics.js +1 -1
  288. package/lib/umd-es6/metrics.js.gz +0 -0
  289. package/lib/umd-es6/persisters/persister-automerge.js +1 -1
  290. package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
  291. package/lib/umd-es6/persisters/persister-browser.js +1 -1
  292. package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
  293. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  294. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  295. package/lib/umd-es6/persisters/persister-electric-sql.js +1 -1
  296. package/lib/umd-es6/persisters/persister-electric-sql.js.gz +0 -0
  297. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js +1 -1
  298. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  299. package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -1
  300. package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
  301. package/lib/umd-es6/persisters/persister-file.js +1 -1
  302. package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
  303. package/lib/umd-es6/persisters/persister-indexed-db.js +1 -1
  304. package/lib/umd-es6/persisters/persister-indexed-db.js.gz +0 -0
  305. package/lib/umd-es6/persisters/persister-libsql.js +1 -0
  306. package/lib/umd-es6/persisters/persister-libsql.js.gz +0 -0
  307. package/lib/umd-es6/persisters/persister-partykit-client.js +1 -1
  308. package/lib/umd-es6/persisters/persister-partykit-client.js.gz +0 -0
  309. package/lib/umd-es6/persisters/persister-remote.js +1 -1
  310. package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
  311. package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -1
  312. package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  313. package/lib/umd-es6/persisters/persister-sqlite3.js +1 -1
  314. package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
  315. package/lib/umd-es6/persisters/persister-yjs.js +1 -1
  316. package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
  317. package/lib/umd-es6/persisters.js +1 -1
  318. package/lib/umd-es6/persisters.js.gz +0 -0
  319. package/lib/umd-es6/queries.js +1 -1
  320. package/lib/umd-es6/queries.js.gz +0 -0
  321. package/lib/umd-es6/relationships.js +1 -1
  322. package/lib/umd-es6/relationships.js.gz +0 -0
  323. package/lib/umd-es6/store.js +1 -1
  324. package/lib/umd-es6/store.js.gz +0 -0
  325. package/lib/umd-es6/tinybase.js +1 -1
  326. package/lib/umd-es6/tinybase.js.gz +0 -0
  327. package/lib/umd-es6/tools.js +1 -1
  328. package/lib/umd-es6/tools.js.gz +0 -0
  329. package/lib/umd-es6/ui-react-dom-debug.js +1 -1
  330. package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
  331. package/package.json +34 -29
  332. 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 strSplit = (str, separator = '', limit) => str.split(separator, limit);
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 stampNew = (time = EMPTY_STRING, thing) => [time, thing];
167
- const stampNewMap = (time = EMPTY_STRING) => stampNew(time, mapNew());
168
- const stampNewObj = (time) => stampNew(time, objNew());
169
- const mapStamp = ([time, value], mapper) => [time, mapper(value, time)];
170
- const cloneStamp = ([time, value]) => [time, value];
171
- const mapStampMapToObj = (stampedMap, mapper) =>
172
- mapStamp(stampedMap, (map) => mapToObj(map, mapper));
173
- const mergeStamps = (newThingStamps, thingStamps, changes, merge) =>
174
- objForEach(newThingStamps, (newThingStamp, thingId) =>
175
- mergeStamp(
176
- newThingStamp,
177
- mapEnsure(thingStamps, thingId, stampNewMap),
178
- (changes[thingId] = objNew()),
179
- merge,
180
- ),
181
- );
182
- const mergeStamp = ([newTime, newThing], thingStamp, changes, merge) => {
183
- if (newTime > thingStamp[0]) {
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 mergeLeafStamps = (newLeafStamps, leafStamps, changes) =>
189
- objForEach(newLeafStamps, ([newTime, newLeaf], leafId) => {
190
- const leafStamp = mapEnsure(leafStamps, leafId, stampNew);
191
- if (newTime > leafStamp[0]) {
192
- leafStamp[0] = newTime;
193
- leafStamp[1] = changes[leafId] = newLeaf;
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 = (cell) => {
296
- const type = getTypeOf(cell);
297
- return isTypeStringOrBoolean(type) || (type == NUMBER && isFiniteNumber(cell))
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 = hash(uniqueId);
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 newContentStamp = (time = EMPTY_STRING) => [
1727
+ const newContentHsm = (time = EMPTY_STRING) => [
1726
1728
  time,
1727
- [stampNewMap(time), stampNewMap(time)],
1729
+ [hashStampNewMap(time), hashStampNewMap(time)],
1730
+ 0,
1728
1731
  ];
1729
1732
  const createMergeableStore = (id) => {
1730
1733
  let listening = 1;
1731
- let contentStamp = newContentStamp();
1734
+ let contentHsm = newContentHsm();
1732
1735
  let transactionTime;
1733
- let finishTransactionMergeableChanges;
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 preFinishTransaction = () => {
1743
- if (listening) {
1744
- finishTransactionMergeableChanges = getTransactionMergeableChanges();
1745
- const [time, [changedTablesStamp, changedValuesStamp]] =
1746
- finishTransactionMergeableChanges;
1747
- const cellsTouched = !objIsEmpty(changedTablesStamp[1]);
1748
- const valuesTouched = !objIsEmpty(changedValuesStamp[1]);
1749
- const [, [tablesStamp, valuesStamp]] = contentStamp;
1750
- if (cellsTouched || valuesTouched) {
1751
- contentStamp[0] = time;
1752
- }
1753
- if (cellsTouched) {
1754
- tablesStamp[0] = time;
1755
- objToArray(changedTablesStamp[1], ([, changedRowStamps], tableId) => {
1756
- const tableStamp = mapEnsure(tablesStamp[1], tableId, stampNewMap);
1757
- tableStamp[0] = time;
1758
- objToArray(changedRowStamps, ([, changedCellStamps], rowId) => {
1759
- const rowStamp = mapEnsure(tableStamp[1], rowId, stampNewMap);
1760
- rowStamp[0] = time;
1761
- objToArray(changedCellStamps, ([, newCell], cellId) =>
1762
- mapSet(rowStamp[1], cellId, stampNew(time, newCell)),
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
- if (valuesTouched) {
1768
- valuesStamp[0] = time;
1769
- objToArray(changedValuesStamp[1], ([, newValue], valueId) =>
1770
- mapSet(valuesStamp[1], valueId, stampNew(time, newValue)),
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 postFinishTransaction = () =>
1776
- (transactionTime = finishTransactionMergeableChanges = void 0);
1777
- const merge = (mergeableStore2) => {
1778
- const mergeableContent = mergeableStore.getMergeableContent();
1779
- const mergeableContent2 = mergeableStore2.getMergeableContent();
1780
- mergeableStore2.applyMergeableChanges(mergeableContent);
1781
- return applyMergeableChanges(mergeableContent2);
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
- mapStamp(contentStamp, ([tablesStamp, valuesStamp]) => [
1785
- mapStampMapToObj(tablesStamp, (rowsStamp) =>
1786
- mapStampMapToObj(rowsStamp, (cellsStamp) =>
1787
- mapStampMapToObj(cellsStamp, cloneStamp),
1788
- ),
1852
+ hashStampMap(contentHsm, ([tables, values]) => [
1853
+ hashStampMapToObj(tables, (table) =>
1854
+ hashStampMapToObj(table, (row) => hashStampMapToObj(row)),
1789
1855
  ),
1790
- mapStampMapToObj(valuesStamp, cloneStamp),
1856
+ hashStampMapToObj(values),
1791
1857
  ]);
1792
1858
  const setMergeableContent = (mergeableContent) => {
1793
1859
  disableListening(() =>
1794
1860
  store.transaction(() => {
1795
1861
  store.delTables().delValues();
1796
- contentStamp = newContentStamp();
1862
+ contentHsm = newContentHsm();
1797
1863
  }),
1798
1864
  );
1799
- applyMergeableChanges(mergeableContent);
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(finishTransactionMergeableChanges)) {
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 [[, tableStamps], [, valuesStamp]] = mergeableChanges[1];
1882
+ const [[, tablesObj], [, valuesObj]] = mergeableChanges[1];
1814
1883
  objToArray(changedCells, (changedTable, tableId) => {
1815
- const [, rowStamps] = (tableStamps[tableId] = stampNewObj(time));
1884
+ const [, rowsObj] = (tablesObj[tableId] = stampNewObj(time));
1816
1885
  objToArray(changedTable, (changedRow, rowId) => {
1817
- const [, cellStamps] = (rowStamps[rowId] = stampNewObj(time));
1886
+ const [, cellsObj] = (rowsObj[rowId] = stampNewObj(time));
1818
1887
  objToArray(
1819
1888
  changedRow,
1820
1889
  ([, newCell], cellId) =>
1821
- (cellStamps[cellId] = stampNew(time, newCell)),
1890
+ (cellsObj[cellId] = stampNew(time, newCell)),
1822
1891
  );
1823
1892
  });
1824
1893
  });
1825
1894
  objToArray(
1826
1895
  changedValues,
1827
1896
  ([, newValue], valueId) =>
1828
- (valuesStamp[valueId] = stampNew(time, newValue)),
1897
+ (valuesObj[valueId] = stampNew(time, newValue)),
1829
1898
  );
1830
1899
  return mergeableChanges;
1831
1900
  }
1832
- return finishTransactionMergeableChanges;
1901
+ return transactionMergeableChanges;
1833
1902
  };
1834
- const applyMergeableChanges = (newContentStamp2) => {
1835
- const changes = [{}, {}];
1836
- seenHlc(newContentStamp2[0]);
1837
- mergeStamp(
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(
@@ -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
  };