lib0 0.2.112 → 0.2.115-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (331) hide show
  1. package/README.md +1 -1
  2. package/broadcastchannel.js +1 -1
  3. package/buffer.d.ts +3 -3
  4. package/buffer.d.ts.map +1 -1
  5. package/buffer.js +1 -1
  6. package/coverage/tmp/coverage-27667-1761218530660-0.json +1 -0
  7. package/coverage/tmp/{coverage-20055-1752683207886-0.json → coverage-27668-1761218485882-0.json} +1 -1
  8. package/crypto/aes-gcm.d.ts +4 -4
  9. package/crypto/aes-gcm.d.ts.map +1 -1
  10. package/crypto/aes-gcm.js +6 -6
  11. package/crypto/common.d.ts +1 -1
  12. package/crypto/common.d.ts.map +1 -1
  13. package/crypto/common.js +1 -1
  14. package/crypto/ecdsa.d.ts +2 -2
  15. package/crypto/ecdsa.d.ts.map +1 -1
  16. package/crypto/ecdsa.js +4 -4
  17. package/crypto/rsa-oaep.d.ts +2 -2
  18. package/crypto/rsa-oaep.d.ts.map +1 -1
  19. package/crypto/rsa-oaep.js +3 -3
  20. package/decoding.d.ts +27 -14
  21. package/decoding.d.ts.map +1 -1
  22. package/decoding.js +12 -8
  23. package/delta/abstract-array.d.ts +166 -0
  24. package/delta/abstract-array.d.ts.map +1 -0
  25. package/delta/abstract-array.js +421 -0
  26. package/delta/abstract.d.ts +69 -0
  27. package/delta/abstract.d.ts.map +1 -0
  28. package/delta/abstract.js +102 -0
  29. package/delta/array.d.ts +23 -0
  30. package/delta/array.d.ts.map +1 -0
  31. package/delta/array.js +45 -0
  32. package/delta/array.test.d.ts +2 -0
  33. package/delta/array.test.d.ts.map +1 -0
  34. package/delta/binding.d.ts +105 -0
  35. package/delta/binding.d.ts.map +1 -0
  36. package/delta/binding.js +369 -0
  37. package/delta/binding.test.d.ts +5 -0
  38. package/delta/binding.test.d.ts.map +1 -0
  39. package/delta/d2.d.ts +705 -0
  40. package/delta/d2.d.ts.map +1 -0
  41. package/delta/d2.js +1309 -0
  42. package/delta/d2.test.d.ts +15 -0
  43. package/delta/d2.test.d.ts.map +1 -0
  44. package/delta/index.d.ts +14 -0
  45. package/delta/index.d.ts.map +1 -0
  46. package/delta/index.js +79 -0
  47. package/delta/map.d.ts +230 -0
  48. package/delta/map.d.ts.map +1 -0
  49. package/delta/map.js +304 -0
  50. package/delta/node.d.ts +119 -0
  51. package/delta/node.d.ts.map +1 -0
  52. package/delta/node.js +183 -0
  53. package/delta/node.test.d.ts +4 -0
  54. package/delta/node.test.d.ts.map +1 -0
  55. package/delta/ops.d.ts +466 -0
  56. package/delta/ops.d.ts.map +1 -0
  57. package/delta/ops.js +544 -0
  58. package/delta/readme.md +129 -0
  59. package/delta/text.d.ts +43 -0
  60. package/delta/text.d.ts.map +1 -0
  61. package/delta/text.js +54 -0
  62. package/delta/text.test.d.ts +6 -0
  63. package/delta/text.test.d.ts.map +1 -0
  64. package/delta/transformer.d.ts +164 -0
  65. package/delta/transformer.d.ts.map +1 -0
  66. package/delta/transformer.js +888 -0
  67. package/delta/transformer.test.d.ts +13 -0
  68. package/delta/transformer.test.d.ts.map +1 -0
  69. package/delta/value.d.ts +84 -0
  70. package/delta/value.d.ts.map +1 -0
  71. package/delta/value.js +168 -0
  72. package/dist/abstract-array.cjs +433 -0
  73. package/dist/abstract-array.cjs.map +1 -0
  74. package/dist/abstract.cjs +122 -0
  75. package/dist/abstract.cjs.map +1 -0
  76. package/dist/aes-gcm.cjs +12 -12
  77. package/dist/aes-gcm.cjs.map +1 -1
  78. package/dist/array.cjs +60 -17
  79. package/dist/array.cjs.map +1 -1
  80. package/dist/array2.cjs +26 -0
  81. package/dist/array2.cjs.map +1 -0
  82. package/dist/binding.cjs +398 -0
  83. package/dist/binding.cjs.map +1 -0
  84. package/dist/{broadcastchannel-2c4b0a1c.cjs → broadcastchannel-b4eaea6e.cjs} +4 -4
  85. package/dist/broadcastchannel-b4eaea6e.cjs.map +1 -0
  86. package/dist/broadcastchannel.cjs +12 -12
  87. package/dist/{buffer-a74f7330.cjs → buffer-adc4e6ea.cjs} +7 -7
  88. package/dist/buffer-adc4e6ea.cjs.map +1 -0
  89. package/dist/buffer.cjs +11 -11
  90. package/dist/buffer.d.ts +3 -3
  91. package/dist/buffer.d.ts.map +1 -1
  92. package/dist/cache.cjs +6 -6
  93. package/dist/common.cjs +1 -1
  94. package/dist/common.cjs.map +1 -1
  95. package/dist/component.cjs +14 -9
  96. package/dist/component.cjs.map +1 -1
  97. package/dist/crypto/aes-gcm.d.ts +4 -4
  98. package/dist/crypto/aes-gcm.d.ts.map +1 -1
  99. package/dist/crypto/common.d.ts +1 -1
  100. package/dist/crypto/common.d.ts.map +1 -1
  101. package/dist/crypto/ecdsa.d.ts +2 -2
  102. package/dist/crypto/ecdsa.d.ts.map +1 -1
  103. package/dist/crypto/rsa-oaep.d.ts +2 -2
  104. package/dist/crypto/rsa-oaep.d.ts.map +1 -1
  105. package/dist/d2.cjs +1347 -0
  106. package/dist/d2.cjs.map +1 -0
  107. package/dist/{decoding-2b136346.cjs → decoding-50b9ce38.cjs} +18 -14
  108. package/dist/decoding-50b9ce38.cjs.map +1 -0
  109. package/dist/decoding.cjs +6 -6
  110. package/dist/decoding.d.ts +27 -14
  111. package/dist/decoding.d.ts.map +1 -1
  112. package/dist/delta/abstract-array.d.ts +166 -0
  113. package/dist/delta/abstract-array.d.ts.map +1 -0
  114. package/dist/delta/abstract.d.ts +69 -0
  115. package/dist/delta/abstract.d.ts.map +1 -0
  116. package/dist/delta/array.d.ts +23 -0
  117. package/dist/delta/array.d.ts.map +1 -0
  118. package/dist/delta/array.test.d.ts +2 -0
  119. package/dist/delta/array.test.d.ts.map +1 -0
  120. package/dist/delta/binding.d.ts +105 -0
  121. package/dist/delta/binding.d.ts.map +1 -0
  122. package/dist/delta/binding.test.d.ts +5 -0
  123. package/dist/delta/binding.test.d.ts.map +1 -0
  124. package/dist/delta/d2.d.ts +705 -0
  125. package/dist/delta/d2.d.ts.map +1 -0
  126. package/dist/delta/d2.test.d.ts +15 -0
  127. package/dist/delta/d2.test.d.ts.map +1 -0
  128. package/dist/delta/index.d.ts +14 -0
  129. package/dist/delta/index.d.ts.map +1 -0
  130. package/dist/delta/map.d.ts +230 -0
  131. package/dist/delta/map.d.ts.map +1 -0
  132. package/dist/delta/node.d.ts +119 -0
  133. package/dist/delta/node.d.ts.map +1 -0
  134. package/dist/delta/node.test.d.ts +4 -0
  135. package/dist/delta/node.test.d.ts.map +1 -0
  136. package/dist/delta/ops.d.ts +466 -0
  137. package/dist/delta/ops.d.ts.map +1 -0
  138. package/dist/delta/text.d.ts +43 -0
  139. package/dist/delta/text.d.ts.map +1 -0
  140. package/dist/delta/text.test.d.ts +6 -0
  141. package/dist/delta/text.test.d.ts.map +1 -0
  142. package/dist/delta/transformer.d.ts +164 -0
  143. package/dist/delta/transformer.d.ts.map +1 -0
  144. package/dist/delta/transformer.test.d.ts +13 -0
  145. package/dist/delta/transformer.test.d.ts.map +1 -0
  146. package/dist/delta/value.d.ts +84 -0
  147. package/dist/delta/value.d.ts.map +1 -0
  148. package/dist/{diff-77c4cf8e.cjs → diff-f0776c15.cjs} +2 -2
  149. package/dist/{diff-77c4cf8e.cjs.map → diff-f0776c15.cjs.map} +1 -1
  150. package/dist/diff.cjs +3 -3
  151. package/dist/{dom-16daf1a0.cjs → dom-2b123630.cjs} +31 -2
  152. package/dist/dom-2b123630.cjs.map +1 -0
  153. package/dist/dom.cjs +17 -2
  154. package/dist/dom.cjs.map +1 -1
  155. package/dist/dom.d.ts +17 -0
  156. package/dist/dom.d.ts.map +1 -1
  157. package/dist/ecdsa.cjs +4 -4
  158. package/dist/ecdsa.cjs.map +1 -1
  159. package/dist/{encoding-1acb59c4.cjs → encoding-7f85922c.cjs} +5 -5
  160. package/dist/encoding-7f85922c.cjs.map +1 -0
  161. package/dist/encoding.cjs +4 -4
  162. package/dist/encoding.d.ts +6 -6
  163. package/dist/encoding.d.ts.map +1 -1
  164. package/dist/{environment-2de08e0e.cjs → environment-90227ead.cjs} +4 -4
  165. package/dist/{environment-2de08e0e.cjs.map → environment-90227ead.cjs.map} +1 -1
  166. package/dist/environment.cjs +5 -5
  167. package/dist/{error-8582d695.cjs → error-0c1f634f.cjs} +10 -2
  168. package/dist/error-0c1f634f.cjs.map +1 -0
  169. package/dist/error.cjs +2 -1
  170. package/dist/error.cjs.map +1 -1
  171. package/dist/error.d.ts +1 -0
  172. package/dist/error.d.ts.map +1 -1
  173. package/dist/{eventloop-b299a889.cjs → eventloop-a0168106.cjs} +2 -2
  174. package/dist/{eventloop-b299a889.cjs.map → eventloop-a0168106.cjs.map} +1 -1
  175. package/dist/eventloop.cjs +3 -3
  176. package/dist/{function-09b8292c.cjs → function-e7d18feb.cjs} +2 -2
  177. package/dist/{function-09b8292c.cjs.map → function-e7d18feb.cjs.map} +1 -1
  178. package/dist/function.cjs +2 -2
  179. package/dist/index.cjs +23 -22
  180. package/dist/index.cjs.map +1 -1
  181. package/dist/index2.cjs +71 -0
  182. package/dist/index2.cjs.map +1 -0
  183. package/dist/{indexeddb-0cbb4d6f.cjs → indexeddb-46d1e737.cjs} +3 -3
  184. package/dist/{indexeddb-0cbb4d6f.cjs.map → indexeddb-46d1e737.cjs.map} +1 -1
  185. package/dist/indexeddb.cjs +5 -5
  186. package/dist/indexeddbV2.cjs +2 -1
  187. package/dist/indexeddbV2.cjs.map +1 -1
  188. package/dist/jwt.cjs +12 -12
  189. package/dist/list.cjs +39 -12
  190. package/dist/list.cjs.map +1 -1
  191. package/dist/list.d.ts +13 -3
  192. package/dist/list.d.ts.map +1 -1
  193. package/dist/logging.cjs +11 -9
  194. package/dist/logging.cjs.map +1 -1
  195. package/dist/logging.common.cjs +7 -7
  196. package/dist/logging.node.cjs +7 -7
  197. package/dist/{map-0dabcc55.cjs → map-24d263c0.cjs} +7 -1
  198. package/dist/map-24d263c0.cjs.map +1 -0
  199. package/dist/map.cjs +314 -7
  200. package/dist/map.cjs.map +1 -1
  201. package/dist/map.d.ts +1 -0
  202. package/dist/map.d.ts.map +1 -1
  203. package/dist/map2.cjs +15 -0
  204. package/dist/map2.cjs.map +1 -0
  205. package/dist/{math-08e068f9.cjs → math-96d5e8c4.cjs} +4 -2
  206. package/dist/math-96d5e8c4.cjs.map +1 -0
  207. package/dist/math.cjs +1 -1
  208. package/dist/math.d.ts.map +1 -1
  209. package/dist/metric.cjs +1 -1
  210. package/dist/node.cjs +206 -0
  211. package/dist/node.cjs.map +1 -0
  212. package/dist/{number-466d8922.cjs → number-1fb57bba.cjs} +2 -2
  213. package/dist/{number-466d8922.cjs.map → number-1fb57bba.cjs.map} +1 -1
  214. package/dist/number.cjs +2 -2
  215. package/dist/{object-491858d1.cjs → object-18980796.cjs} +12 -2
  216. package/dist/object-18980796.cjs.map +1 -0
  217. package/dist/object.cjs +3 -1
  218. package/dist/object.cjs.map +1 -1
  219. package/dist/object.d.ts +3 -0
  220. package/dist/object.d.ts.map +1 -1
  221. package/dist/observable.cjs +1 -1
  222. package/dist/ops.cjs +575 -0
  223. package/dist/ops.cjs.map +1 -0
  224. package/dist/patience.cjs +2 -2
  225. package/dist/performance.node.cjs +4 -4
  226. package/dist/pledge.cjs +2 -1
  227. package/dist/pledge.cjs.map +1 -1
  228. package/dist/{prng-24dfe0bf.cjs → prng-004c76e8.cjs} +5 -5
  229. package/dist/{prng-24dfe0bf.cjs.map → prng-004c76e8.cjs.map} +1 -1
  230. package/dist/prng.cjs +12 -12
  231. package/dist/prng.d.ts +1 -1
  232. package/dist/prng.d.ts.map +1 -1
  233. package/dist/{promise-7d13a97c.cjs → promise-cda7b9bb.cjs} +2 -2
  234. package/dist/{promise-7d13a97c.cjs.map → promise-cda7b9bb.cjs.map} +1 -1
  235. package/dist/promise.cjs +3 -3
  236. package/dist/rabin-gf2-polynomial.cjs +11 -11
  237. package/dist/rabin-uncached.cjs +11 -11
  238. package/dist/rabin.cjs +11 -11
  239. package/dist/random.cjs +1 -1
  240. package/dist/rsa-oaep.cjs +3 -3
  241. package/dist/rsa-oaep.cjs.map +1 -1
  242. package/dist/schema.cjs +572 -167
  243. package/dist/schema.cjs.map +1 -1
  244. package/dist/schema.d.ts +326 -122
  245. package/dist/schema.d.ts.map +1 -1
  246. package/dist/schema.test.d.ts +5 -0
  247. package/dist/schema.test.d.ts.map +1 -1
  248. package/dist/{sort-b8702761.cjs → sort-812cc211.cjs} +2 -2
  249. package/dist/{sort-b8702761.cjs.map → sort-812cc211.cjs.map} +1 -1
  250. package/dist/sort.cjs +2 -2
  251. package/dist/{statistics-c2316dca.cjs → statistics-65f6114b.cjs} +2 -2
  252. package/dist/{statistics-c2316dca.cjs.map → statistics-65f6114b.cjs.map} +1 -1
  253. package/dist/statistics.cjs +2 -2
  254. package/dist/{string-b2827a90.cjs → string-fddc5f8b.cjs} +3 -3
  255. package/dist/string-fddc5f8b.cjs.map +1 -0
  256. package/dist/string.cjs +1 -1
  257. package/dist/string.d.ts +3 -3
  258. package/dist/string.d.ts.map +1 -1
  259. package/dist/testing.cjs +16 -16
  260. package/dist/text.cjs +79 -0
  261. package/dist/text.cjs.map +1 -0
  262. package/dist/{time-bc2081b9.cjs → time-d8438852.cjs} +2 -2
  263. package/dist/{time-bc2081b9.cjs.map → time-d8438852.cjs.map} +1 -1
  264. package/dist/time.cjs +2 -2
  265. package/dist/traits.cjs +22 -0
  266. package/dist/traits.cjs.map +1 -1
  267. package/dist/traits.d.ts +1 -0
  268. package/dist/traits.d.ts.map +1 -1
  269. package/dist/traits.test.d.ts.map +1 -1
  270. package/dist/transformer.cjs +930 -0
  271. package/dist/transformer.cjs.map +1 -0
  272. package/dist/url.cjs +2 -1
  273. package/dist/url.cjs.map +1 -1
  274. package/dist/value.cjs +187 -0
  275. package/dist/value.cjs.map +1 -0
  276. package/dist/webcrypto.d.ts +1 -1
  277. package/dist/webcrypto.d.ts.map +1 -1
  278. package/dist/{websocket-40a601d4.cjs → websocket-b073d0fc.cjs} +3 -3
  279. package/dist/{websocket-40a601d4.cjs.map → websocket-b073d0fc.cjs.map} +1 -1
  280. package/dist/websocket.cjs +4 -4
  281. package/dom.d.ts +17 -0
  282. package/dom.d.ts.map +1 -1
  283. package/dom.js +21 -0
  284. package/encoding.d.ts +6 -6
  285. package/encoding.d.ts.map +1 -1
  286. package/encoding.js +1 -1
  287. package/error.d.ts +1 -0
  288. package/error.d.ts.map +1 -1
  289. package/error.js +6 -0
  290. package/list.d.ts +13 -3
  291. package/list.d.ts.map +1 -1
  292. package/list.js +36 -8
  293. package/map.d.ts +1 -0
  294. package/map.d.ts.map +1 -1
  295. package/map.js +6 -0
  296. package/math.d.ts.map +1 -1
  297. package/math.js +3 -1
  298. package/object.d.ts +3 -0
  299. package/object.d.ts.map +1 -1
  300. package/object.js +9 -1
  301. package/package.json +9 -3
  302. package/prng.d.ts +1 -1
  303. package/prng.d.ts.map +1 -1
  304. package/prng.js +1 -1
  305. package/schema.d.ts +326 -122
  306. package/schema.d.ts.map +1 -1
  307. package/schema.js +513 -141
  308. package/schema.test.d.ts +5 -0
  309. package/schema.test.d.ts.map +1 -1
  310. package/string.d.ts +3 -3
  311. package/string.d.ts.map +1 -1
  312. package/string.js +2 -2
  313. package/test.html +1 -0
  314. package/test.js +13 -1
  315. package/traits.d.ts +1 -0
  316. package/traits.d.ts.map +1 -1
  317. package/traits.js +21 -0
  318. package/traits.test.d.ts.map +1 -1
  319. package/webcrypto.d.ts +1 -1
  320. package/webcrypto.d.ts.map +1 -1
  321. package/coverage/tmp/coverage-20054-1752683240888-0.json +0 -1
  322. package/dist/broadcastchannel-2c4b0a1c.cjs.map +0 -1
  323. package/dist/buffer-a74f7330.cjs.map +0 -1
  324. package/dist/decoding-2b136346.cjs.map +0 -1
  325. package/dist/dom-16daf1a0.cjs.map +0 -1
  326. package/dist/encoding-1acb59c4.cjs.map +0 -1
  327. package/dist/error-8582d695.cjs.map +0 -1
  328. package/dist/map-0dabcc55.cjs.map +0 -1
  329. package/dist/math-08e068f9.cjs.map +0 -1
  330. package/dist/object-491858d1.cjs.map +0 -1
  331. package/dist/string-b2827a90.cjs.map +0 -1
@@ -0,0 +1,15 @@
1
+ export function testDeltaBasics(): void;
2
+ export function testText(): void;
3
+ export function testDelta(_tc: t.TestCase): void;
4
+ export function testDeltaMerging(_tc: t.TestCase): void;
5
+ export function testUseAttributes(_tc: t.TestCase): void;
6
+ export function testUseAttribution(_tc: t.TestCase): void;
7
+ export function testMapTyping(): void;
8
+ export function testMapDeltaBasics(_tc: t.TestCase): void;
9
+ export function testMapDeltaModify(_tc: t.TestCase): void;
10
+ export function testMapDelta(_tc: t.TestCase): void;
11
+ export function testRepeatRebaseMergeDeltas(tc: t.TestCase): void;
12
+ export function testNodeDelta(_tc: t.TestCase): void;
13
+ export function testRecursiveNode(): void;
14
+ import * as t from 'lib0/testing';
15
+ //# sourceMappingURL=d2.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"d2.test.d.ts","sourceRoot":"","sources":["d2.test.js"],"names":[],"mappings":"AAMO,wCA4BN;AAEM,iCAWN;AAKM,+BAFI,CAAC,CAAC,QAAQ,QAKpB;AAKM,sCAFI,CAAC,CAAC,QAAQ,QAYpB;AAKM,uCAFI,CAAC,CAAC,QAAQ,QAuBpB;AAKM,wCAFI,CAAC,CAAC,QAAQ,QAsBpB;AAEM,sCAaN;AAKM,wCAFI,CAAC,CAAC,QAAQ,QAgCpB;AAKM,wCAFI,CAAC,CAAC,QAAQ,QA2CpB;AAKM,kCAFI,CAAC,CAAC,QAAQ,QAoDpB;AAKM,gDAFI,CAAC,CAAC,QAAQ,QAoEpB;AAKM,mCAFI,CAAC,CAAC,QAAQ,QAwBpB;AAEM,0CAkBN;mBAtYkB,cAAc"}
@@ -0,0 +1,14 @@
1
+ export type Text = import("./text.js").DeltaText<any>;
2
+ export type Delta = Array<any> | import("./node.js").DeltaNode<string, any, any, any>;
3
+ export type RecursiveNode<NodeName extends string, Attributes extends {
4
+ [key: string]: any;
5
+ }, Children, WithText extends boolean> = import("./node.js").RecursiveDeltaNode<NodeName, Attributes, Children, WithText>;
6
+ export type ValueUnwrap<V> = V extends import("./value.js").DeltaValue<infer X> ? X : V;
7
+ export { TextOp, InsertOp, DeleteOp, ModifyOp, RetainOp, MapInsertOp, MapDeleteOp, MapModifyOp, $textOp, $insertOp, $insertOpWith, $deleteOp, $modifyOp, $modifyOpWith, $anyOp } from "./ops.js";
8
+ export { $delta, $$delta, AbstractDelta, mergeDeltas } from "./abstract.js";
9
+ export { array, $array, $arrayAny, DeltaArray as Array } from "./array.js";
10
+ export { node, $node, $nodeAny, DeltaNode as Node } from "./node.js";
11
+ export { map, $map, $mapAny, $mapJson, DeltaMap as Map } from "./map.js";
12
+ export { text, $text, $textAny, DeltaTextBuilder as TextBuilder } from "./text.js";
13
+ export { value, $value, $valueAny, DeltaValue as Value, DeltaValueBuilder as ValueBuilder } from "./value.js";
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.js"],"names":[],"mappings":"mBAoDa,OAAO,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC;oBAIlC,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,WAAW,EAAE,SAAS,CAAC,MAAM,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC;0BAIrD,QAAQ,SAAjB,MAAQ,EACgB,UAAU,SAAlC;IAAG,CAAC,GAAG,EAAC,MAAM,GAAG,GAAG,CAAA;CAAG,EACvB,QAAQ,EACE,QAAQ,SAAlB,OAAS,IACT,OAAO,WAAW,EAAE,kBAAkB,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC;wBAYhF,CAAC,IACD,CAAC,SAAS,OAAO,YAAY,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC"}
package/delta/index.js ADDED
@@ -0,0 +1,79 @@
1
+ export {
2
+ TextOp,
3
+ InsertOp,
4
+ DeleteOp,
5
+ ModifyOp,
6
+ RetainOp,
7
+ MapInsertOp,
8
+ MapDeleteOp,
9
+ MapModifyOp,
10
+ $textOp,
11
+ $insertOp,
12
+ $insertOpWith,
13
+ $deleteOp,
14
+ $modifyOp,
15
+ $modifyOpWith,
16
+ $anyOp
17
+ } from './ops.js'
18
+
19
+ export { $delta, $$delta, AbstractDelta, mergeDeltas } from './abstract.js'
20
+
21
+ // delta array
22
+ export {
23
+ array,
24
+ $array,
25
+ $arrayAny,
26
+ DeltaArray as Array
27
+ } from './array.js'
28
+
29
+ export {
30
+ node,
31
+ $node,
32
+ $nodeAny,
33
+ DeltaNode as Node
34
+ } from './node.js'
35
+
36
+ // delta map
37
+ export {
38
+ map,
39
+ $map,
40
+ $mapAny,
41
+ $mapJson,
42
+ DeltaMap as Map
43
+ } from './map.js'
44
+
45
+ export {
46
+ text,
47
+ $text,
48
+ $textAny,
49
+ DeltaTextBuilder as TextBuilder
50
+ } from './text.js'
51
+
52
+ /**
53
+ * @typedef {import('./text.js').DeltaText<any>} Text
54
+ */
55
+
56
+ /**
57
+ * @typedef {Array<any> | import('./node.js').DeltaNode<string,any,any,any> } Delta
58
+ */
59
+
60
+ /**
61
+ * @template {string} NodeName
62
+ * @template {{ [key:string]: any }} Attributes
63
+ * @template Children
64
+ * @template {boolean} WithText
65
+ * @typedef {import('./node.js').RecursiveDeltaNode<NodeName, Attributes, Children, WithText>} RecursiveNode
66
+ */
67
+
68
+ export {
69
+ value,
70
+ $value,
71
+ $valueAny,
72
+ DeltaValue as Value,
73
+ DeltaValueBuilder as ValueBuilder
74
+ } from './value.js'
75
+
76
+ /**
77
+ * @template V
78
+ * @typedef {V extends import('./value.js').DeltaValue<infer X> ? X : V} ValueUnwrap
79
+ */
package/delta/map.d.ts ADDED
@@ -0,0 +1,230 @@
1
+ export const $mapJson: s.Schema<{
2
+ [x: string]: ({
3
+ attribution?: ({
4
+ insert?: string[] | undefined;
5
+ insertAt?: number | undefined;
6
+ delete?: string[] | undefined;
7
+ deleteAt?: number | undefined;
8
+ attributes?: {
9
+ [x: string]: string[];
10
+ } | undefined;
11
+ attributesAt?: number | undefined;
12
+ } & {}) | null | undefined;
13
+ } & {
14
+ type: "insert";
15
+ value: any;
16
+ }) | ({} & {
17
+ type: "modify";
18
+ value: any;
19
+ }) | ({
20
+ attribution?: ({
21
+ insert?: string[] | undefined;
22
+ insertAt?: number | undefined;
23
+ delete?: string[] | undefined;
24
+ deleteAt?: number | undefined;
25
+ attributes?: {
26
+ [x: string]: string[];
27
+ } | undefined;
28
+ attributesAt?: number | undefined;
29
+ } & {}) | null | undefined;
30
+ } & {
31
+ type: "delete";
32
+ });
33
+ }>;
34
+ /**
35
+ * @template {{ [key:string]: ops.DeltaMapOps }} OPS
36
+ * @typedef {{ [K in keyof OPS]: (Extract<OPS[K],ops.MapInsertOp<any>> extends ops.MapInsertOp<infer V,any> ? ops.MapInsertOp<V, K> : never) | (Extract<OPS[K],ops.MapDeleteOp<any>> extends ops.MapDeleteOp<infer V,any> ? ops.MapDeleteOp<V,K> : never) | (Extract<OPS[K],ops.MapModifyOp<any>> extends ops.MapModifyOp<infer V,any> ? (ops.MapModifyOp<V,K>&OPS[K]) : never) }[keyof OPS]} KeyedOps */
37
+ /**
38
+ * @template {{ [key: string]: any }} [Vals={[key:string]:any}]
39
+ * @extends AbstractDelta
40
+ */
41
+ export class DeltaMap<Vals extends {
42
+ [key: string]: any;
43
+ } = {
44
+ [key: string]: any;
45
+ }> extends AbstractDelta {
46
+ /**
47
+ * @param {s.Schema<Vals>} $vals
48
+ */
49
+ constructor($vals: s.Schema<Vals>);
50
+ $vals: s.Schema<Partial<s.$ObjectToType<{
51
+ [key: string]: s.Schema<any>;
52
+ [key: number]: s.Schema<any>;
53
+ [key: symbol]: s.Schema<any>;
54
+ }>>> | s.Schema<Vals>;
55
+ /**
56
+ * @type {gmap.GlobalMap<any,ops.DeltaMapOps>}
57
+ */
58
+ _changes: gmap.GlobalMap<any, ops.DeltaMapOps>;
59
+ /**
60
+ * @type {import('./abstract.js').Attribution?}
61
+ */
62
+ usedAttribution: import("./abstract.js").Attribution | null;
63
+ /**
64
+ *
65
+ * Iterate through the changes. There are two approches to iterate through changes. The
66
+ * following two examples achieve the same thing:
67
+ *
68
+ * @example
69
+ * d.forEach(op => {
70
+ * if (op instanceof dmap.MapInsertOp) {
71
+ * console.log('content inserted:', op.key, op.value)
72
+ * } else if (op instanceof dmap.MapDeleteOp) {
73
+ * console.log('content deleted:', op.key, op.prevValue)
74
+ * } else if (op instanceof delta.MapModifyOp) {
75
+ * console.log('content was modified:', op.key, op.)
76
+ * op.modify
77
+ * }
78
+ * })
79
+ *
80
+ * The second approach doesn't require instanceof checks.
81
+ *
82
+ * @example
83
+ * d.forEach(null,
84
+ * (insertOp) => insertOp.insert,
85
+ * (retainOp) => insertOp.retain
86
+ * (deleteOp) => insertOp.delete
87
+ * (modifyOp) => insertOp.modify
88
+ * )
89
+ *
90
+ * @template {Vals} ValsX
91
+ * @param {null|((op:KeyedOps<MapOpsFromValues<ValsX>>)=>void)} changeHandler
92
+ * @param {null|((insertOp:Extract<KeyedOps<MapOpsFromValues<ValsX>>,ops.MapInsertOp<any,any>>)=>void)} insertHandler
93
+ * @param {null|((deleteOp:Extract<KeyedOps<MapOpsFromValues<ValsX>>,ops.MapDeleteOp<any,any>>)=>void)} deleteHandler
94
+ * @param {null|((modifyOp:Extract<KeyedOps<MapOpsFromValues<ValsX>>,ops.MapModifyOp<any,any>>)=>void)} modifyHandler
95
+ */
96
+ forEach<ValsX extends Vals>(changeHandler?: null | ((op: KeyedOps<MapOpsFromValues<ValsX>>) => void), insertHandler?: null | ((insertOp: Extract<KeyedOps<MapOpsFromValues<ValsX>>, ops.MapInsertOp<any, any>>) => void), deleteHandler?: null | ((deleteOp: Extract<KeyedOps<MapOpsFromValues<ValsX>>, ops.MapDeleteOp<any, any>>) => void), modifyHandler?: null | ((modifyOp: Extract<KeyedOps<MapOpsFromValues<ValsX>>, ops.MapModifyOp<any, any>>) => void)): void;
97
+ /**
98
+ * @template {keyof Vals} K
99
+ * @param {K} key
100
+ * @return {MapOpsFromValues<Vals>[K] | undefined}
101
+ */
102
+ get<K extends keyof Vals>(key: K): MapOpsFromValues<Vals>[K] | undefined;
103
+ /**
104
+ * @param {keyof Vals} key
105
+ */
106
+ has(key: keyof Vals): boolean;
107
+ /**
108
+ * @param {DeltaMap<any>} other
109
+ * @return {boolean}
110
+ */
111
+ equals(other: DeltaMap<any>): boolean;
112
+ get size(): number;
113
+ /**
114
+ * @return {s.Unwrap<$mapJson>}
115
+ */
116
+ toJSON(): s.Unwrap<s.Schema<{
117
+ [x: string]: ({
118
+ attribution?: ({
119
+ insert?: string[] | undefined;
120
+ insertAt?: number | undefined;
121
+ delete?: string[] | undefined;
122
+ deleteAt?: number | undefined;
123
+ attributes?: {
124
+ [x: string]: string[];
125
+ } | undefined;
126
+ attributesAt?: number | undefined;
127
+ } & {}) | null | undefined;
128
+ } & {
129
+ type: "insert";
130
+ value: any;
131
+ }) | ({} & {
132
+ type: "modify";
133
+ value: any;
134
+ }) | ({
135
+ attribution?: ({
136
+ insert?: string[] | undefined;
137
+ insertAt?: number | undefined;
138
+ delete?: string[] | undefined;
139
+ deleteAt?: number | undefined;
140
+ attributes?: {
141
+ [x: string]: string[];
142
+ } | undefined;
143
+ attributesAt?: number | undefined;
144
+ } & {}) | null | undefined;
145
+ } & {
146
+ type: "delete";
147
+ });
148
+ }>>;
149
+ /**
150
+ * @template {keyof Vals} K
151
+ * @param {K} key
152
+ * @param {Extract<Vals[K], AbstractDelta>} delta
153
+ */
154
+ modify<K extends keyof Vals>(key: K, delta: Extract<Vals[K], AbstractDelta>): this;
155
+ /**
156
+ * @template {keyof Vals} K
157
+ * @param {K} key
158
+ * @param {Vals[K]} newVal
159
+ * @param {Vals[K]|undefined} prevValue
160
+ * @param {import('./abstract.js').Attribution?} attribution
161
+ */
162
+ set<K extends keyof Vals>(key: K, newVal: Vals[K], prevValue?: Vals[K] | undefined, attribution?: import("./abstract.js").Attribution | null): this;
163
+ /**
164
+ * @param {Partial<Vals>} kv
165
+ * @param {import('./abstract.js').Attribution?} attribution
166
+ */
167
+ setMany(kv: Partial<Vals>, attribution?: import("./abstract.js").Attribution | null): this;
168
+ /**
169
+ * @template {keyof Vals} K
170
+ * @param {K} key
171
+ * @param {Vals[K]|undefined} prevValue
172
+ * @param {import('./abstract.js').Attribution?} attribution
173
+ */
174
+ delete<K extends keyof Vals>(key: K, prevValue?: Vals[K] | undefined, attribution?: import("./abstract.js").Attribution | null): this;
175
+ /**
176
+ * @param {import('./abstract.js').Attribution?} attribution
177
+ */
178
+ useAttribution(attribution: import("./abstract.js").Attribution | null): this;
179
+ /**
180
+ *
181
+ * - insert vs delete ⇒ insert takes precedence
182
+ * - insert vs modify ⇒ insert takes precedence
183
+ * - insert vs insert ⇒ priority decides
184
+ * - delete vs modify ⇒ delete takes precedence
185
+ * - delete vs delete ⇒ current delete op is removed because item has already been deleted
186
+ * - modify vs modify ⇒ rebase using priority
187
+ *
188
+ * @param {DeltaMap<Vals>} other
189
+ * @param {boolean} priority
190
+ */
191
+ rebase(other: DeltaMap<Vals>, priority: boolean): void;
192
+ /**
193
+ * @param {DeltaMap<Partial<Vals>>} other
194
+ */
195
+ apply(other: DeltaMap<Partial<Vals>>): void;
196
+ /**
197
+ * @return {this}
198
+ */
199
+ clone(): this;
200
+ done(): DeltaMap<Vals>;
201
+ /**
202
+ * @param {DeltaMap<Partial<Vals>>} other
203
+ */
204
+ [traits.EqualityTraitSymbol](other: DeltaMap<Partial<Vals>>): boolean;
205
+ }
206
+ export function map<$Vals extends s.Schema<{
207
+ [key: string]: any;
208
+ }> | {
209
+ [key: string]: s.Schema<any>;
210
+ } = s.Schema<{
211
+ [key: string]: any;
212
+ }>>($vals?: $Vals): DeltaMap<$Vals extends s.Schema<infer $V> ? $V : (s._ObjectDefToSchema<$Vals> extends s.Schema<infer $V> ? $V : never)>;
213
+ export function $map<Vals extends {
214
+ [key: string]: any;
215
+ }>($vals: s.Schema<Vals>): s.Schema<DeltaMap<Vals>>;
216
+ export const $mapAny: s.Schema<DeltaMap<{
217
+ [key: string]: any;
218
+ }>>;
219
+ export type KeyedOps<OPS extends {
220
+ [key: string]: ops.DeltaMapOps;
221
+ }> = { [K in keyof OPS]: (Extract<OPS[K], ops.MapInsertOp<any>> extends ops.MapInsertOp<infer V, any> ? ops.MapInsertOp<V, K> : never) | (Extract<OPS[K], ops.MapDeleteOp<any>> extends ops.MapDeleteOp<infer V, any> ? ops.MapDeleteOp<V, K> : never) | (Extract<OPS[K], ops.MapModifyOp<any>> extends ops.MapModifyOp<infer V, any> ? (ops.MapModifyOp<V, K> & OPS[K]) : never); }[keyof OPS];
222
+ export type MapOpsFromValues<Vals extends {
223
+ [key: string]: any;
224
+ }> = { [K in keyof Vals]: Vals[K] extends DeltaMap<infer DM> ? ops.MapInsertOp<Vals[K]> | ops.MapDeleteOp<Vals[K]> | ops.MapModifyOp<DeltaMap<DM>> : (ops.MapInsertOp<Exclude<Vals[K], undefined>> | ops.MapDeleteOp<Exclude<Vals[K], undefined>>); };
225
+ import * as s from '../schema.js';
226
+ import { AbstractDelta } from './abstract.js';
227
+ import * as gmap from '../map.js';
228
+ import * as ops from './ops.js';
229
+ import * as traits from '../traits.js';
230
+ //# sourceMappingURL=map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map.d.ts","sourceRoot":"","sources":["map.js"],"names":[],"mappings":"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"}
package/delta/map.js ADDED
@@ -0,0 +1,304 @@
1
+ import * as gmap from '../map.js'
2
+ import * as fun from '../function.js'
3
+ import * as traits from '../traits.js'
4
+ import * as s from '../schema.js'
5
+ import * as ops from './ops.js'
6
+ import { AbstractDelta, mergeAttrs, $delta } from './abstract.js'
7
+
8
+ export const $mapJson = s.$record(s.$string, ops.$deltaMapChangeJson)
9
+
10
+ /**
11
+ * @template {{ [key:string]: ops.DeltaMapOps }} OPS
12
+ * @typedef {{ [K in keyof OPS]: (Extract<OPS[K],ops.MapInsertOp<any>> extends ops.MapInsertOp<infer V,any> ? ops.MapInsertOp<V, K> : never) | (Extract<OPS[K],ops.MapDeleteOp<any>> extends ops.MapDeleteOp<infer V,any> ? ops.MapDeleteOp<V,K> : never) | (Extract<OPS[K],ops.MapModifyOp<any>> extends ops.MapModifyOp<infer V,any> ? (ops.MapModifyOp<V,K>&OPS[K]) : never) }[keyof OPS]} KeyedOps */
13
+
14
+ /**
15
+ * @template {{ [key: string]: any }} [Vals={[key:string]:any}]
16
+ * @extends AbstractDelta
17
+ */
18
+ export class DeltaMap extends AbstractDelta {
19
+ /**
20
+ * @param {s.Schema<Vals>} $vals
21
+ */
22
+ constructor ($vals) {
23
+ super()
24
+ this.$vals = s.$$object.check($vals) ? $vals.partial : $vals
25
+ /**
26
+ * @type {gmap.GlobalMap<any,ops.DeltaMapOps>}
27
+ */
28
+ this._changes = gmap.create()
29
+ /**
30
+ * @type {import('./abstract.js').Attribution?}
31
+ */
32
+ this.usedAttribution = null
33
+ }
34
+
35
+ isEmpty () {
36
+ return this._changes.size === 0
37
+ }
38
+
39
+ /**
40
+ *
41
+ * Iterate through the changes. There are two approches to iterate through changes. The
42
+ * following two examples achieve the same thing:
43
+ *
44
+ * @example
45
+ * d.forEach(op => {
46
+ * if (op instanceof dmap.MapInsertOp) {
47
+ * console.log('content inserted:', op.key, op.value)
48
+ * } else if (op instanceof dmap.MapDeleteOp) {
49
+ * console.log('content deleted:', op.key, op.prevValue)
50
+ * } else if (op instanceof delta.MapModifyOp) {
51
+ * console.log('content was modified:', op.key, op.)
52
+ * op.modify
53
+ * }
54
+ * })
55
+ *
56
+ * The second approach doesn't require instanceof checks.
57
+ *
58
+ * @example
59
+ * d.forEach(null,
60
+ * (insertOp) => insertOp.insert,
61
+ * (retainOp) => insertOp.retain
62
+ * (deleteOp) => insertOp.delete
63
+ * (modifyOp) => insertOp.modify
64
+ * )
65
+ *
66
+ * @template {Vals} ValsX
67
+ * @param {null|((op:KeyedOps<MapOpsFromValues<ValsX>>)=>void)} changeHandler
68
+ * @param {null|((insertOp:Extract<KeyedOps<MapOpsFromValues<ValsX>>,ops.MapInsertOp<any,any>>)=>void)} insertHandler
69
+ * @param {null|((deleteOp:Extract<KeyedOps<MapOpsFromValues<ValsX>>,ops.MapDeleteOp<any,any>>)=>void)} deleteHandler
70
+ * @param {null|((modifyOp:Extract<KeyedOps<MapOpsFromValues<ValsX>>,ops.MapModifyOp<any,any>>)=>void)} modifyHandler
71
+ */
72
+ forEach (changeHandler = null, insertHandler = null, deleteHandler = null, modifyHandler = null) {
73
+ this._changes.forEach((change) => {
74
+ changeHandler?.(/** @type {any} */ (change))
75
+ switch (change.constructor) {
76
+ case ops.MapDeleteOp:
77
+ deleteHandler?.(/** @type {any} */ (change))
78
+ break
79
+ case ops.MapInsertOp:
80
+ insertHandler?.(/** @type {any} */ (change))
81
+ break
82
+ case ops.MapModifyOp:
83
+ modifyHandler?.(/** @type {any} */ (change))
84
+ break
85
+ }
86
+ })
87
+ }
88
+
89
+ /**
90
+ * @template {keyof Vals} K
91
+ * @param {K} key
92
+ * @return {MapOpsFromValues<Vals>[K] | undefined}
93
+ */
94
+ get (key) {
95
+ return /** @type {(MapOpsFromValues<Vals>[K] & { key:K })|undefined} */ (this._changes.get(key))
96
+ }
97
+
98
+ /**
99
+ * @param {keyof Vals} key
100
+ */
101
+ has (key) {
102
+ return this._changes.has(key)
103
+ }
104
+
105
+ /**
106
+ * @param {DeltaMap<any>} other
107
+ * @return {boolean}
108
+ */
109
+ equals (other) {
110
+ return this[traits.EqualityTraitSymbol](other)
111
+ }
112
+
113
+ get size () {
114
+ return this._changes.size
115
+ }
116
+
117
+ /**
118
+ * @return {s.Unwrap<$mapJson>}
119
+ */
120
+ toJSON () {
121
+ /**
122
+ * @type {s.Unwrap<$mapJson>}
123
+ */
124
+ const changes = {}
125
+ this._changes.forEach((change, key) => {
126
+ changes[/** @type {string} */ (key)] = change.toJSON()
127
+ })
128
+ return changes
129
+ }
130
+
131
+ /**
132
+ * @template {keyof Vals} K
133
+ * @param {K} key
134
+ * @param {Extract<Vals[K], AbstractDelta>} delta
135
+ */
136
+ modify (key, delta) {
137
+ this._changes.set(key, /** @type {any} */ (new ops.MapModifyOp(key, valsKeySchema(this.$vals, key).cast(delta))))
138
+ return this
139
+ }
140
+
141
+ /**
142
+ * @template {keyof Vals} K
143
+ * @param {K} key
144
+ * @param {Vals[K]} newVal
145
+ * @param {Vals[K]|undefined} prevValue
146
+ * @param {import('./abstract.js').Attribution?} attribution
147
+ */
148
+ set (key, newVal, prevValue = undefined, attribution = null) {
149
+ const mergedAttribution = mergeAttrs(this.usedAttribution, attribution)
150
+ const $v = valsKeySchema(this.$vals, key)
151
+ this._changes.set(key, /** @type {any} */ (new ops.MapInsertOp(key, $v.cast(newVal), prevValue && $v.cast(prevValue), mergedAttribution)))
152
+ return this
153
+ }
154
+
155
+ /**
156
+ * @param {Partial<Vals>} kv
157
+ * @param {import('./abstract.js').Attribution?} attribution
158
+ */
159
+ setMany (kv, attribution = null) {
160
+ for (const key in kv) {
161
+ this.set(key, /** @type {Vals[any]} */ (kv[key]), undefined, attribution)
162
+ }
163
+ return this
164
+ }
165
+
166
+ /**
167
+ * @template {keyof Vals} K
168
+ * @param {K} key
169
+ * @param {Vals[K]|undefined} prevValue
170
+ * @param {import('./abstract.js').Attribution?} attribution
171
+ */
172
+ delete (key, prevValue = undefined, attribution = null) {
173
+ const mergedAttribution = mergeAttrs(this.usedAttribution, attribution)
174
+ this._changes.set(key, /** @type {any} */ (new ops.MapDeleteOp(key, prevValue === undefined ? prevValue : valsKeySchema(this.$vals, key).cast(prevValue), mergedAttribution)))
175
+ return this
176
+ }
177
+
178
+ /**
179
+ * @param {import('./abstract.js').Attribution?} attribution
180
+ */
181
+ useAttribution (attribution) {
182
+ this.usedAttribution = attribution
183
+ return this
184
+ }
185
+
186
+ /**
187
+ *
188
+ * - insert vs delete ⇒ insert takes precedence
189
+ * - insert vs modify ⇒ insert takes precedence
190
+ * - insert vs insert ⇒ priority decides
191
+ * - delete vs modify ⇒ delete takes precedence
192
+ * - delete vs delete ⇒ current delete op is removed because item has already been deleted
193
+ * - modify vs modify ⇒ rebase using priority
194
+ *
195
+ * @param {DeltaMap<Vals>} other
196
+ * @param {boolean} priority
197
+ */
198
+ rebase (other, priority) {
199
+ this.forEach(null,
200
+ insertOp => {
201
+ if (other.get(insertOp.key)?.constructor === ops.MapInsertOp && !priority) {
202
+ this._changes.delete(insertOp.key)
203
+ }
204
+ },
205
+ deleteOp => {
206
+ const otherOp = other.get(deleteOp.key)
207
+ if (otherOp?.constructor === ops.MapInsertOp) {
208
+ this._changes.delete(otherOp.key)
209
+ }
210
+ },
211
+ modifyOp => {
212
+ const otherOp = other.get(modifyOp.key)
213
+ if (otherOp == null) {
214
+ // nop
215
+ } else if (otherOp.constructor === ops.MapModifyOp) {
216
+ modifyOp.value.rebase(otherOp.value, priority)
217
+ } else {
218
+ this._changes.delete(otherOp.key)
219
+ }
220
+ }
221
+ )
222
+ }
223
+
224
+ /**
225
+ * @param {DeltaMap<Partial<Vals>>} other
226
+ */
227
+ apply (other) {
228
+ /** @type {DeltaMap<Vals>} */ (other).forEach(op => {
229
+ const c = this._changes.get(op.key)
230
+ if (ops.$modifyOp.check(op)) {
231
+ if ($delta.check(c?.value)) {
232
+ /** @type {DeltaMap<any>} */ (c.value).apply(op.value)
233
+ } else {
234
+ // then this is a simple modify
235
+ this._changes.set(op.key, /** @type {any} */ (op))
236
+ }
237
+ } else {
238
+ op.prevValue = c?.value
239
+ this._changes.set(op.key, /** @type {any} */ (op))
240
+ }
241
+ }
242
+ )
243
+ }
244
+
245
+ /**
246
+ * @return {this}
247
+ */
248
+ clone () {
249
+ const d = /** @type {this} */ (new DeltaMap(this.$vals))
250
+ this.forEach(change => {
251
+ d._changes.set(change.key, /** @type {any} */ (change))
252
+ })
253
+ d.origin = this.origin
254
+ d.isDiff = this.isDiff
255
+ return d
256
+ }
257
+
258
+ done () {
259
+ return /** @type {DeltaMap<Vals>} */ (this)
260
+ }
261
+
262
+ /**
263
+ * @param {DeltaMap<Partial<Vals>>} other
264
+ */
265
+ [traits.EqualityTraitSymbol] (other) {
266
+ return fun.equalityDeep(this._changes, other._changes)
267
+ }
268
+ }
269
+
270
+ /**
271
+ * @template {s.Schema<{ [Key:string]: ops.DeltaMapOps }>} OPS
272
+ * @template {keyof s.Unwrap<OPS>} K
273
+ * @param {OPS} $ops
274
+ * @param {K} k
275
+ * @return {s.Schema<s.Unwrap<OPS>[K]>}
276
+ */
277
+ const valsKeySchema = ($ops, k) => s.$$object.check($ops) ? ($ops.shape[k] || s.$never) : ((s.$$record.check($ops) && $ops.shape.keys.check(k)) ? ($ops.shape.values) : s.$never)
278
+
279
+ /**
280
+ * @template {{ [key:string]: any }} Vals
281
+ * @typedef {{ [K in keyof Vals]: Vals[K] extends DeltaMap<infer DM> ? ops.MapInsertOp<Vals[K]>|ops.MapDeleteOp<Vals[K]>|ops.MapModifyOp<DeltaMap<DM>> : (ops.MapInsertOp<Exclude<Vals[K],undefined>>|ops.MapDeleteOp<Exclude<Vals[K],undefined>>) }} MapOpsFromValues
282
+ */
283
+
284
+ /**
285
+ * Create a new DeltaMap, optionally supply a schema.
286
+ *
287
+ * @template {s.Schema<{ [key:string]: any }> | { [key:string]: s.Schema<any> }} [$Vals=s.Schema<{ [key:string]: any }>]
288
+ * @param {$Vals} $vals
289
+ * @return {DeltaMap<$Vals extends s.Schema<infer $V> ? $V : (s._ObjectDefToSchema<$Vals> extends s.Schema<infer $V> ? $V : never)>}
290
+ */
291
+ export const map = ($vals = /** @type {any} */ (s.$record(s.$string, s.$any))) => /** @type {any} */ (new DeltaMap(/** @type {any} */ (s.$$schema.check($vals) ? $vals : s.$object($vals))))
292
+
293
+ /**
294
+ * @template {{ [key:string]: any }} Vals
295
+ * @param {s.Schema<Vals>} $vals
296
+ * @return {s.Schema<DeltaMap<Vals>>}
297
+ */
298
+ export const $map = $vals => {
299
+ const $valsPartial = s.$$object.check($vals) ? $vals.partial : $vals
300
+ return /** @type {any} */ (s.$instanceOf(DeltaMap, o => Array.from(o._changes.entries()).every(([k, op]) =>
301
+ !ops.$insertOp.check(op) || $valsPartial.check({ [k]: op.value })
302
+ )))
303
+ }
304
+ export const $mapAny = s.$instanceOf(DeltaMap)