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,930 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var error = require('./error-0c1f634f.cjs');
6
+ var ops = require('./ops.cjs');
7
+ var abstract = require('./abstract.cjs');
8
+ var array$1 = require('./array.cjs');
9
+ var node$1 = require('./node.cjs');
10
+ var map$1 = require('./map.cjs');
11
+ require('./text.cjs');
12
+ var value = require('./value.cjs');
13
+ var schema = require('./schema.cjs');
14
+ require('./object-18980796.cjs');
15
+ require('./traits.cjs');
16
+ require('./function-e7d18feb.cjs');
17
+ require('./array-78849c95.cjs');
18
+ require('./set-5b47859e.cjs');
19
+ require('./list.cjs');
20
+ require('./environment-90227ead.cjs');
21
+ require('./map-24d263c0.cjs');
22
+ require('./string-fddc5f8b.cjs');
23
+ require('./conditions-f5c0c102.cjs');
24
+ require('./storage.cjs');
25
+ require('./abstract-array.cjs');
26
+ require('./math-96d5e8c4.cjs');
27
+
28
+ /**
29
+ * Creates a transformer template after receiving schema for DeltaA.
30
+ *
31
+ * @template {delta.AbstractDelta} DeltaA
32
+ * @typedef {<DA extends DeltaA> ($deltaA: s.Schema<DA>) => Template<any,DA,any>} TransformerFactory
33
+ */
34
+
35
+ /**
36
+ * @template {TransformerFactory<any>} T
37
+ * @template {delta.AbstractDelta} DeltaA
38
+ * @typedef {T extends (($deltaA: s.Schema<DeltaA>) => Template<any,DeltaA,infer DeltaB>) ? DeltaB : never } DeltaBFromTransformerFactory
39
+ */
40
+
41
+ /**
42
+ * @template {s.Unwrap<delta.$delta>|null} [DeltaA=s.Unwrap<delta.$delta>|null]
43
+ * @template {s.Unwrap<delta.$delta>|null} [DeltaB=s.Unwrap<delta.$delta>|null]
44
+ * @typedef {{ a: DeltaA, b: DeltaB }} TransformResult
45
+ */
46
+
47
+ /**
48
+ * @template {s.Unwrap<delta.$delta>|null} DeltaA
49
+ * @template {s.Unwrap<delta.$delta>|null} DeltaB
50
+ * @param {DeltaA} a
51
+ * @param {DeltaB} b
52
+ * @return {TransformResult<DeltaA,DeltaB>}
53
+ */
54
+ const transformResult = (a, b) => ({ a, b });
55
+ const transformResultEmpty = transformResult(null, null);
56
+
57
+ /**
58
+ * @template {any} State
59
+ * @template {s.Unwrap<delta.$delta>} DeltaA
60
+ * @template {s.Unwrap<delta.$delta>} DeltaB
61
+ * @typedef {object} TransformerDef
62
+ * @property {s.Schema<DeltaA>} TransformerDef.$in
63
+ * @property {s.Schema<DeltaB>} TransformerDef.$out
64
+ * @property {function (this: Template<State,DeltaA,DeltaB>): State} TransformerDef.state
65
+ * @property {(deltaIn:NoInfer<DeltaA>,s:NoInfer<State>) => TransformResult<NoInfer<DeltaA>?,NoInfer<DeltaB>?>} TransformerDef.applyA
66
+ * @property {(deltaOut:NoInfer<DeltaB>,s:NoInfer<State>) => TransformResult<NoInfer<DeltaA>?,NoInfer<DeltaB>?>} TransformerDef.applyB
67
+ */
68
+
69
+ /**
70
+ * A Delta Transformer ensures that it keeps two sources A and B in-sync, even if they use a
71
+ * different update format.
72
+ *
73
+ * @template {any} State
74
+ * @template {s.Unwrap<typeof delta.$delta>} DeltaA
75
+ * @template {s.Unwrap<typeof delta.$delta>} DeltaB
76
+ */
77
+ class Transformer {
78
+ /**
79
+ * @param {Template<State,DeltaA,DeltaB>} t
80
+ * @param {State} s
81
+ */
82
+ constructor (t, s) {
83
+ this.t = t;
84
+ this._state = s;
85
+ /**
86
+ * Pending a op, for internal use only
87
+ * @type {DeltaA?}
88
+ */
89
+ this._pa = null;
90
+ /**
91
+ * Pending a op, for internal use only
92
+ * @type {DeltaB?}
93
+ */
94
+ this._pb = null;
95
+ /**
96
+ * Whether this transformer value has been initially consumebd by the parent transformer.
97
+ */
98
+ this._init = false;
99
+ /**
100
+ * @type {Transformer<any,any,any>?}
101
+ */
102
+ this.parent = null;
103
+ }
104
+
105
+ /**
106
+ * @param {DeltaA} deltaA
107
+ * @return {TransformResult<DeltaA?,DeltaB?>}
108
+ */
109
+ applyA (deltaA) {
110
+ return this.t._applyA(deltaA, this._state)
111
+ }
112
+
113
+ /**
114
+ * @param {DeltaB} deltaB
115
+ * @return {TransformResult<DeltaA?,DeltaB?>}
116
+ */
117
+ applyB (deltaB) {
118
+ return this.t._applyB(deltaB, this._state)
119
+ }
120
+ }
121
+
122
+ /**
123
+ * @param {Array<Transformer<any,delta.AbstractDelta,delta.AbstractDelta>>} trs
124
+ * @param {TransformResult} output
125
+ * @return {boolean}
126
+ */
127
+ const _forwardPipe = (trs, output) => {
128
+ let again = false;
129
+ for (let i = 0; i < trs.length; i++) {
130
+ const tr = trs[i];
131
+ if (tr._pa === null) continue
132
+ const { a, b } = tr.applyA(tr._pa);
133
+ tr._pa = null;
134
+ if (a !== null) {
135
+ if (i === 0) {
136
+ output.a = abstract.mergeDeltas(output.a, a);
137
+ } else {
138
+ // need to interate back to integrate the produced backwards-change
139
+ again = true;
140
+ trs[i - 1]._pb = a;
141
+ }
142
+ }
143
+ if (b !== null) {
144
+ if (i === trs.length - 1) {
145
+ output.b = abstract.mergeDeltas(output.b, b);
146
+ } else {
147
+ trs[i + 1]._pa = b;
148
+ }
149
+ }
150
+ }
151
+ return again
152
+ };
153
+
154
+ /**
155
+ * @param {Array<Transformer<any,delta.AbstractDelta,delta.AbstractDelta>>} trs
156
+ * @param {TransformResult} output
157
+ * @return {boolean}
158
+ */
159
+ const _backwardPipe = (trs, output) => {
160
+ let again = false;
161
+ for (let i = trs.length - 1; i >= 0; i--) {
162
+ const tr = trs[i];
163
+ if (tr._pb === null) continue
164
+ const { a, b } = tr.applyA(tr._pb);
165
+ tr._pb = null;
166
+ if (a !== null) {
167
+ if (i === 0) {
168
+ output.a = abstract.mergeDeltas(output.a, a);
169
+ } else {
170
+ // need to interate back to integrate the produced backwards-change
171
+ trs[i - 1]._pb = a;
172
+ }
173
+ }
174
+ if (b !== null) {
175
+ if (i === trs.length - 1) {
176
+ output.b = abstract.mergeDeltas(output.b, b);
177
+ } else {
178
+ // need to interate back to integrate the produced backwards-change
179
+ again = true;
180
+ trs[i + 1]._pa = a;
181
+ }
182
+ }
183
+ }
184
+ return again
185
+ };
186
+
187
+ /**
188
+ * @template State
189
+ * @template {s.Unwrap<typeof delta.$delta>} DeltaA
190
+ * @template {s.Unwrap<typeof delta.$delta>} DeltaB
191
+ */
192
+ class Template {
193
+ /**
194
+ * @param {TransformerDef<State,DeltaA,DeltaB>} def
195
+ */
196
+ constructor ({ $in, $out, state, applyA, applyB }) {
197
+ /**
198
+ * @type {s.Schema<DeltaA>}
199
+ */
200
+ this.$in = $in;
201
+ /**
202
+ * @type {s.Schema<DeltaB>}
203
+ */
204
+ this.$out = $out;
205
+ /**
206
+ * @type {() => State}
207
+ */
208
+ this._state = state;
209
+ /**
210
+ * @type {typeof applyA}
211
+ */
212
+ this._applyA = applyA;
213
+ /**
214
+ * @type {typeof applyB}
215
+ */
216
+ this._applyB = applyB;
217
+ /**
218
+ * Cache for stateless transformers.
219
+ *
220
+ * @type {Transformer<State,DeltaA,DeltaB>?}
221
+ */
222
+ this._tr = null;
223
+ }
224
+
225
+ /**
226
+ * @template {delta.AbstractDelta} R
227
+ * @param {($d: s.Schema<DeltaB>) => Template<any,DeltaB,R>} t
228
+ * @return {Template<any,DeltaA,R>}
229
+ */
230
+ pipe (t) {
231
+ /**
232
+ * @type {TransformerPipeTemplate<any,any>}
233
+ */
234
+ const tpipe = new TransformerPipeTemplate();
235
+ tpipe.templates.push(this, t(this.$out));
236
+ return tpipe
237
+ }
238
+
239
+ init () {
240
+ if (this._tr != null) return this._tr
241
+ // reuse stateless transformers
242
+ const s = this._state();
243
+ if (s === null) {
244
+ return (this._tr = new Transformer(this, s))
245
+ }
246
+ return new Transformer(this, s)
247
+ }
248
+ }
249
+
250
+ /**
251
+ * @template {delta.AbstractDelta} DeltaA
252
+ * @template {delta.AbstractDelta} DeltaB
253
+ * @param {s.Schema<DeltaA>} $deltaA
254
+ * @param {s.Schema<DeltaB>} $deltaB
255
+ * @return {s.Schema<Template<any,DeltaA,DeltaB>>}
256
+ */
257
+ const $template = ($deltaA, $deltaB) => /** @type {s.Schema<Template<any,any,any>>} */ (schema.$instanceOf(Template, o => o.$in.extends($deltaA) && o.$out.extends($deltaB)));
258
+ const $templateAny = /** @type {s.Schema<Template<any,any,any>>} */ (schema.$instanceOf(Template));
259
+
260
+ /**
261
+ * @template {delta.AbstractDelta} DeltaA
262
+ * @template {delta.AbstractDelta} DeltaB
263
+ * @typedef {Template<any,DeltaA,DeltaB>|(
264
+ * DeltaB extends delta.Map<infer MKV>
265
+ * ? (MKV|DeltaB)
266
+ * : (DeltaB extends delta.Array<infer MArr> ? (MArr|DeltaB) : DeltaB))
267
+ * } MaybeFixedTemplate
268
+ */
269
+
270
+ /**
271
+ * @template X
272
+ * @typedef {X extends Template<any,any,infer D> ? (D extends delta.Value<infer V> ? V : D) : X} UnwrapTemplateForArray
273
+ */
274
+
275
+ /**
276
+ * @template {any} MaybeFixed
277
+ * @typedef {MaybeFixed extends Template<any,any,any>
278
+ * ? MaybeFixed
279
+ * : Template<any,any,
280
+ * MaybeFixed extends delta.AbstractDelta
281
+ * ? MaybeFixed
282
+ * : (MaybeFixed extends Array<any>
283
+ * ? delta.Array<UnwrapTemplateForArray<MaybeFixed[number]>>
284
+ * : (MaybeFixed extends {[key:string]:any} ? delta.Map<MaybeFixed> : never))
285
+ * >
286
+ * } MaybeFixedTemplateToTemplate
287
+ */
288
+
289
+ /**
290
+ * @template MaybeFixed
291
+ * @param {MaybeFixed} maybeFixed
292
+ * @return {MaybeFixed extends Template<any,any,delta.Delta> ? (Extract<MaybeFixed,Template<any,any,any>>) : Template<any,any,MaybeFixed extends delta.Delta ? Extract<MaybeFixed,delta.Delta> : delta.Array<MaybeFixed[keyof MaybeFixed]>>}
293
+ */
294
+ const maybeFixedToTemplate = maybeFixed => $templateAny.check(maybeFixed)
295
+ ? /** @type {any} */ (maybeFixed)
296
+ : (abstract.$delta.check(maybeFixed)
297
+ ? /** @type {any} */ (fixed(maybeFixed))
298
+ : (schema.$arrayAny.check(maybeFixed)
299
+ ? /** @type {any} */ (fixed(array$1.array().insert(maybeFixed).done()))
300
+ : (schema.$objectAny.check(maybeFixed) ? /** @type {any} */ (fixed(map$1.map().setMany(maybeFixed).done())) : error.unexpectedCase())
301
+ )
302
+ );
303
+
304
+ /**
305
+ * @template {delta.AbstractDelta} DeltaA
306
+ * @template {Template<any,DeltaA,any>} Tr
307
+ * @param {s.Schema<DeltaA>} _$deltaA
308
+ * @param {Tr} transformer
309
+ * @return {<DA extends DeltaA>($d:s.Schema<DA>) => Tr extends Template<any,any,infer DeltaB> ? Template<any,DA,DeltaB> : never}
310
+ */
311
+ const transformStatic = (_$deltaA, transformer) => () => /** @type {any} */ (transformer);
312
+
313
+ /**
314
+ * @template {delta.AbstractDelta} DeltaA
315
+ * @template {<DA extends DeltaA> ($deltaA: s.Schema<DA>) => Template<any,DA,any>} TF
316
+ * @param {s.Schema<DeltaA>} _$deltaA
317
+ * @param {TF} transformerFactory
318
+ * @return {TF}
319
+ */
320
+ const transform = (_$deltaA, transformerFactory) => transformerFactory;
321
+
322
+ /**
323
+ * @type {TransformerDef<any,any,any>}
324
+ */
325
+ const pipeTemplateDef = {
326
+ $in: schema.$any,
327
+ $out: schema.$any,
328
+ state: function () { return /** @type {TransformerPipeTemplate<any,any>} */ (/** @type {unknown} */ (this)).templates.map(t => t.init()) },
329
+ applyA: (dchange, trs) => {
330
+ const output = transformResult(null, null);
331
+ let again = true;
332
+ trs[0]._pa = dchange;
333
+ while (again) {
334
+ // apply forwards
335
+ again = _forwardPipe(trs, output);
336
+ // iterate back
337
+ if (again) {
338
+ again = _backwardPipe(trs, output);
339
+ }
340
+ }
341
+ return output
342
+ },
343
+ applyB: (dchange, trs) => {
344
+ const output = transformResult(null, null);
345
+ let again = true;
346
+ trs[trs.length - 1]._pb = dchange;
347
+ while (again) {
348
+ // iterate back
349
+ again = _backwardPipe(trs, output);
350
+ // apply forwards
351
+ if (again) {
352
+ again = _forwardPipe(trs, output);
353
+ }
354
+ }
355
+ return output
356
+ }
357
+ };
358
+
359
+ /**
360
+ * @todo just have something like "previousTemplate" to implement pipe. This can be assembled when
361
+ * init the template.
362
+ * @template {s.Unwrap<typeof delta.$delta>} DeltaA
363
+ * @template {s.Unwrap<typeof delta.$delta>} DeltaB
364
+ * @extends {Template<any,DeltaA,DeltaB>}
365
+ */
366
+ class TransformerPipeTemplate extends Template {
367
+ constructor () {
368
+ super(pipeTemplateDef);
369
+ /**
370
+ * @type {Array<Template<any,DeltaA,DeltaB>>}
371
+ */
372
+ this.templates = [];
373
+ }
374
+
375
+ /**
376
+ * @template {delta.AbstractDelta} R
377
+ * @param {($d: s.Schema<DeltaB>) => Template<any,DeltaB,R>} t
378
+ * @return {Template<any,DeltaA,R>}
379
+ */
380
+ pipe (t) {
381
+ /**
382
+ * @type {TransformerPipeTemplate<any,any>}
383
+ */
384
+ const tpipe = new TransformerPipeTemplate();
385
+ tpipe.templates = this.templates.slice();
386
+ tpipe.templates.push(t(this.$out));
387
+ return /** @type {any} */ (tpipe)
388
+ }
389
+ }
390
+
391
+ /**
392
+ * @template {delta.AbstractDelta} DeltaA
393
+ * @template {delta.AbstractDelta} DeltaB
394
+ * @template {delta.AbstractDelta} DeltaC
395
+ * @param {($s: s.Schema<DeltaA>) => Template<any,DeltaA,DeltaB>} t1
396
+ * @param {($s: s.Schema<DeltaB>) => Template<any,DeltaB,DeltaC>} t2
397
+ * @return {($d: s.Schema<DeltaA>) => Template<any,DeltaA,DeltaC>}
398
+ */
399
+ const pipe = (t1, t2) => ($d) => {
400
+ /**
401
+ * @type {TransformerPipeTemplate<any,any>}
402
+ */
403
+ const tpipe = new TransformerPipeTemplate();
404
+ const t1t = t1($d);
405
+ tpipe.templates.push(t1t, t2(t1t.$out));
406
+ return tpipe
407
+ };
408
+
409
+ /**
410
+ * @template {any} State
411
+ * @template {s.Unwrap<typeof delta.$delta>} DeltaIn
412
+ * @template {s.Unwrap<typeof delta.$delta>} DeltaOut
413
+ * @param {TransformerDef<State,DeltaIn,DeltaOut>} def
414
+ * @return {Template<State,DeltaIn,DeltaOut>}
415
+ */
416
+ const template = def => new Template(/** @type {any} */ (def));
417
+
418
+ /**
419
+ * @template FixedContent
420
+ * @param {FixedContent} fixedContent
421
+ * @return {Template<any,any,FixedContent extends delta.AbstractDelta ? FixedContent : delta.Value<FixedContent>>}
422
+ */
423
+ const fixed = fixedContent => {
424
+ const staticDelta = abstract.$delta.check(fixedContent) ? fixedContent : value.value().set(fixedContent).done();
425
+ return template({
426
+ $in: schema.$any,
427
+ $out: schema.$any,
428
+ state: () => ({ e: false }),
429
+ applyA: (_d, s) => {
430
+ if (!s.e) {
431
+ s.e = true;
432
+ return transformResult(null, staticDelta)
433
+ }
434
+ return transformResultEmpty
435
+ },
436
+ applyB: () => {
437
+ // @todo should reverse the change and give back
438
+ error.unexpectedCase();
439
+ }
440
+ })
441
+ };
442
+
443
+ /**
444
+ * @template MaybeTemplate
445
+ * @typedef {[MaybeTemplate] extends [Template<any,any,any>] ? MaybeTemplate : Template<any,any,
446
+ * [MaybeTemplate] extends [delta.AbstractDelta] ? MaybeTemplate : delta.Value<MaybeTemplate>
447
+ * >} AnyToTemplate
448
+ */
449
+
450
+ /**
451
+ * @template {{ [key: string]: any }} MaybeTemplateMap
452
+ * @typedef {{ [K in keyof MaybeTemplateMap]: AnyToTemplate<MaybeTemplateMap[K]> }} AnyMapToTemplate
453
+ */
454
+
455
+ /**
456
+ * @template {Array<any>} MaybeTemplateArray
457
+ * @typedef {{ [K in keyof MaybeTemplateArray]: AnyToTemplate<MaybeTemplateArray[K]> }} AnyArrayToTemplate
458
+ */
459
+
460
+ /**
461
+ * @template {{ [key:string]: any }} T
462
+ * @typedef {Template<
463
+ * any,
464
+ * AnyMapToTemplate<T>[keyof T] extends Template<any, infer DeltaA,any> ? DeltaA : never,
465
+ * delta.Map<{ [K in keyof T]: AnyToTemplate<T[K]> extends Template<any, any, infer DeltaB>
466
+ * ? (DeltaB extends delta.Value<infer V> ? V : DeltaB) : AnyToTemplate<T[K]> }>
467
+ * >} MapDefToTemplate
468
+ */
469
+
470
+ /**
471
+ * @template {{ [key:string]: any }} T
472
+ * @param {T} definition
473
+ * @return {MapDefToTemplate<T> extends Template<any,infer A,infer B> ? Template<any,A,B> : never}
474
+ */
475
+ const map = (definition) => {
476
+ /**
477
+ * @type {{ [key:string]: Template<any,any,any> }}
478
+ */
479
+ const def = {};
480
+ for (const key in definition) {
481
+ const d = definition[key];
482
+ def[key] = $templateAny.check(d) ? d : fixed(d);
483
+ }
484
+ return template({
485
+ $in: schema.$any,
486
+ $out: schema.$any,
487
+ state: () => {
488
+ const mapState = /** @type {{ [key: string]: Transformer<any,any,any> }} */ ({});
489
+ for (const key in def) {
490
+ mapState[key] = def[key].init();
491
+ }
492
+ return /** @type {{ [key in keyof T]: T extends Template<any,infer SDIn, infer SDOut> ? Transformer<any, SDIn, SDOut>: never }} */ (mapState)
493
+ },
494
+ applyA: (d, state) => {
495
+ return _applyMapOpHelper(state, [{ d, src: null }])
496
+ },
497
+ applyB: (d, state) => {
498
+ schema.assert(d, map$1.$mapAny);
499
+ /**
500
+ * @type {Array<{ d: delta.AbstractDelta, src: Transformer<any,any,any>? }>}
501
+ */
502
+ const reverseAChanges = [];
503
+ d.forEach(op => {
504
+ if (ops.$deleteOp.check(op)) {
505
+ error.unexpectedCase();
506
+ }
507
+ const src = state[op.key];
508
+ // src expects a delta value
509
+ const res = src.applyB(ops.$modifyOp.check(op) ? value.value().modify(op.value) : value.value().set(op.value));
510
+ src._pa = res.a;
511
+ src._pb = res.b;
512
+ if (res.a != null) {
513
+ reverseAChanges.push({ d: res.a, src });
514
+ }
515
+ });
516
+ return _applyMapOpHelper(state, reverseAChanges)
517
+ }
518
+ })
519
+ };
520
+
521
+ /**
522
+ * @param {{ [key: string]: Transformer<any, any, any> }} state
523
+ * @param {Array<{ d: delta.AbstractDelta, src: Transformer<any,any,any>? }>} reverseAChanges
524
+ * @return {TransformResult<delta.AbstractDelta?,delta.Map<any>?>}
525
+ */
526
+ const _applyMapOpHelper = (state, reverseAChanges) => {
527
+ /**
528
+ * @type {TransformResult<delta.AbstractDelta?,delta.Map<any>?>}
529
+ */
530
+ const applyResult = transformResult(null, null);
531
+ while (reverseAChanges.length > 0) {
532
+ /**
533
+ * @type {Array<{ d: delta.AbstractDelta, src: Transformer<any,any,any>? }>}
534
+ */
535
+ let nextReverseAChanges = [];
536
+ for (const key in state) {
537
+ const s = state[key];
538
+ let transformPriority = false; // false until own is found
539
+ for (let i = 0; i < reverseAChanges.length; i++) {
540
+ // changes are applied in reverseAChanges order.
541
+ // rebase against all concurrent (the op stored on transformer), then apply
542
+ const r = reverseAChanges[i];
543
+ if (r.src === s) {
544
+ transformPriority = true; // own has less priority, concurrent is applied with higher prio
545
+ continue // don't apply own
546
+ }
547
+ let rd = r.d;
548
+ if (s._pa != null) {
549
+ rd = rd.clone();
550
+ rd.rebase(s._pa, transformPriority);
551
+ }
552
+ const res = s.applyA(rd);
553
+ s._pa = res.a;
554
+ s._pb = abstract.mergeDeltas(s._pb, res.b);
555
+ if (res.a != null) {
556
+ nextReverseAChanges.push({ d: res.a, src: s });
557
+ }
558
+ }
559
+ }
560
+ // merge changes for output
561
+ for (let i = 0; i < reverseAChanges.length; i++) {
562
+ const rc = reverseAChanges[i];
563
+ if (rc.src != null) { // don't apply received deltas
564
+ applyResult.a = abstract.mergeDeltas(applyResult.a, rc.d);
565
+ }
566
+ }
567
+ reverseAChanges = nextReverseAChanges;
568
+ nextReverseAChanges = [];
569
+ }
570
+ // accumulate b changes stored on transformers
571
+ const bRes = map$1.map();
572
+ for (const key in state) {
573
+ const s = state[key];
574
+ if (s._pb) {
575
+ if (s._init) {
576
+ bRes.modify(key, s._pb);
577
+ } else {
578
+ s._init = true;
579
+ bRes.set(key, s._pb);
580
+ }
581
+ }
582
+ }
583
+ if (bRes._changes.size > 0) {
584
+ // opt values (iff delta is of type DeltaValue, map the change to the map)
585
+ bRes._changes.forEach((change, key) => {
586
+ if (value.$valueAny.check(change.value)) {
587
+ const changeOp = change.value.change;
588
+ if (ops.$insertOp.check(changeOp) || ops.$modifyOp.check(changeOp)) {
589
+ bRes.set(key, changeOp.value);
590
+ } else if (ops.$deleteOp.check(changeOp)) {
591
+ bRes.delete(key);
592
+ } else {
593
+ error.unexpectedCase();
594
+ }
595
+ }
596
+ });
597
+ applyResult.b = bRes;
598
+ }
599
+ return applyResult
600
+ };
601
+
602
+ /**
603
+ * @todo This is similar to dt.map. Consider the similarities and try to merge them.
604
+ *
605
+ * @template {Array<any>} T
606
+ * @param {T} definition
607
+ * @return {Template<
608
+ * any,
609
+ * AnyArrayToTemplate<T>[number] extends Template<any, infer DeltaA, any> ? DeltaA : never,
610
+ * delta.Array<AnyArrayToTemplate<T>[number] extends Template<any, any, infer DeltaB> ? delta.ValueUnwrap<DeltaB> : never>
611
+ * >}
612
+ */
613
+ const array = (definition) => {
614
+ /**
615
+ * @type {Array<Template<any,any,any>>}
616
+ */
617
+ const def = [];
618
+ for (let i = 0; i < definition.length; i++) {
619
+ const d = definition[i];
620
+ def[i] = $templateAny.check(d) ? d : fixed(d);
621
+ }
622
+ return /** @type {any} */ (template({
623
+ $in: schema.$any,
624
+ $out: array$1.$arrayAny,
625
+ state: () => {
626
+ const arrState = /** @type {Transformer<any,any,any>[]} */ ([]);
627
+ for (let i = 0; i < def.length; i++) {
628
+ arrState[i] = def[i].init();
629
+ }
630
+ return /** @type {(T extends Template<any,infer SDIn, infer SDOut> ? Transformer<any, SDIn, SDOut>: never)[]} */ (arrState)
631
+ },
632
+ applyA: (d, state) => {
633
+ return _applyArrayOpHelper(state, [{ d, src: null }])
634
+ },
635
+ applyB: (d, state) => {
636
+ schema.assert(d, array$1.$arrayAny);
637
+ /**
638
+ * @type {Array<{ d: delta.AbstractDelta, src: Transformer<any,any,any>? }>}
639
+ */
640
+ const reverseAChanges = [];
641
+ d.forEach((op, index) => {
642
+ if (ops.$deleteOp.check(op) || ops.$insertOp.check(op)) {
643
+ error.unexpectedCase();
644
+ } else if (ops.$modifyOp.check(op)) {
645
+ const src = state[index];
646
+ const res = src.applyB(op.modify);
647
+ src._pa = res.a;
648
+ src._pb = res.b;
649
+ if (res.a != null) {
650
+ reverseAChanges.push({ d: res.a, src });
651
+ }
652
+ }
653
+ });
654
+ return _applyArrayOpHelper(state, reverseAChanges)
655
+ }
656
+ }))
657
+ };
658
+
659
+ /**
660
+ * @param {Transformer<any, any, any>[]} state
661
+ * @param {Array<{ d: delta.AbstractDelta, src: Transformer<any,any,any>? }>} reverseAChanges
662
+ * @return {TransformResult<delta.AbstractDelta?,delta.Array<any>?>}
663
+ */
664
+ const _applyArrayOpHelper = (state, reverseAChanges) => {
665
+ /**
666
+ * @type {TransformResult<delta.AbstractDelta?,delta.Array<any>?>}
667
+ */
668
+ const applyResult = transformResult(null, null);
669
+ while (reverseAChanges.length > 0) {
670
+ /**
671
+ * @type {Array<{ d: delta.AbstractDelta, src: Transformer<any,any,any>? }>}
672
+ */
673
+ let nextReverseAChanges = [];
674
+ for (let i = 0; i < state.length; i++) {
675
+ const s = state[i];
676
+ let transformPriority = false; // false until own is found
677
+ for (let i = 0; i < reverseAChanges.length; i++) {
678
+ // changes are applied in reverseAChanges order.
679
+ // rebase against all concurrent (the op stored on transformer), then apply
680
+ const r = reverseAChanges[i];
681
+ if (r.src === s) {
682
+ transformPriority = true; // own has less priority, concurrent is applied with higher prio
683
+ continue // don't apply own
684
+ }
685
+ let rd = r.d;
686
+ if (s._pa != null) {
687
+ rd = rd.clone();
688
+ rd.rebase(s._pa, transformPriority);
689
+ }
690
+ const res = s.applyA(rd);
691
+ s._pa = res.a;
692
+ s._pb = abstract.mergeDeltas(s._pb, res.b);
693
+ if (res.a != null) {
694
+ nextReverseAChanges.push({ d: res.a, src: s });
695
+ }
696
+ }
697
+ }
698
+ // merge changes for output
699
+ for (let i = 0; i < nextReverseAChanges.length; i++) {
700
+ applyResult.a = abstract.mergeDeltas(applyResult.a, nextReverseAChanges[i].d);
701
+ }
702
+ reverseAChanges = nextReverseAChanges;
703
+ nextReverseAChanges = [];
704
+ }
705
+ // accumulate b changes stored on transformers
706
+ const bRes = array$1.array();
707
+ let performedChange = false;
708
+ for (let i = 0; i < state.length; i++) {
709
+ const s = state[i];
710
+ let spb = s._pb;
711
+ if (spb) {
712
+ if (value.$valueAny.check(spb)) {
713
+ spb = spb.get();
714
+ }
715
+ if (s._init) {
716
+ bRes.modify(spb);
717
+ } else {
718
+ s._init = true;
719
+ bRes.insert([spb]);
720
+ }
721
+ performedChange = true;
722
+ } else {
723
+ bRes.retain(1);
724
+ }
725
+ }
726
+ if (performedChange) {
727
+ applyResult.b = bRes.done();
728
+ }
729
+ return applyResult
730
+ };
731
+
732
+ /**
733
+ * @param {TransformResult<delta.AbstractDelta?, delta.Node<any,any,any>>} res
734
+ * @param {{ attrs: Transformer<any,any,any>, children: Transformer<any,any,any> }} state
735
+ * @param {delta.AbstractDelta?} nextAAttrs apply this in reverse!
736
+ * @param {delta.AbstractDelta?} nextAChildren
737
+ */
738
+ const _nodeApplyA = (res, state, nextAAttrs, nextAChildren) => {
739
+ while (nextAAttrs != null || nextAChildren != null) {
740
+ const resChildren = nextAChildren && state.children.applyA(nextAChildren);
741
+ const resAttrs = (nextAAttrs || resChildren?.a) ? state.attrs.applyA(abstract.mergeDeltas(nextAAttrs, resChildren?.a)) : null;
742
+ nextAChildren = resAttrs?.a;
743
+ nextAAttrs = null;
744
+ res.a = abstract.mergeDeltas(abstract.mergeDeltas(res.a, resChildren?.a), resAttrs?.a);
745
+ resChildren?.b && res.b.children.apply(resChildren.b);
746
+ resAttrs?.b && res.b.attributes.apply(resAttrs.b);
747
+ }
748
+ };
749
+
750
+ /**
751
+ * @template {{ [key:string]: any } | Template<any,any,delta.Map<any>>} T
752
+ * @typedef {T extends Template<any,any,any> ? T : MapDefToTemplate<T>} MapOrMapDefToTemplate
753
+ */
754
+
755
+ /**
756
+ * @template {string} NodeName
757
+ * @template {{ [key:string]:any } | Template<any,any,delta.Map<{[key:string]:any}>>} Attrs - accepts map or map definition
758
+ * @template {Template<any,any,delta.Array<any,any>> | Array<any>} Children
759
+ * @param {NodeName} name
760
+ * @param {Attrs} attributes
761
+ * @param {Children} children
762
+ * @return {Template<
763
+ * any,
764
+ * MapOrMapDefToTemplate<Attrs> extends Template<any, infer A, any> ? A : never,
765
+ * delta.Node<
766
+ * NodeName,
767
+ * MapOrMapDefToTemplate<Attrs> extends Template<any,any,delta.Map<infer M>> ? M : never,
768
+ * MaybeFixedTemplateToTemplate<Children> extends Template<any,any,delta.Array<infer BChildren,any>> ? BChildren : never,
769
+ * any
770
+ * >
771
+ * >}
772
+ */
773
+ const node = (name, attributes, children) => {
774
+ const attrs = /** @type {Template<any,any,delta.Map<any>>} */ ($templateAny.check(attributes) ? attributes : map(attributes));
775
+ const childs = /** @type {Template<any,any,delta.Array<any>>} */ (maybeFixedToTemplate(children));
776
+ // @todo this should be properly inferred
777
+ return /** @type {any} */ (template({
778
+ $in: schema.$any,
779
+ $out: node$1.$node(schema.$literal(name), schema.$any, schema.$any),
780
+ state: () => ({
781
+ attrs: attrs.init(),
782
+ children: childs.init()
783
+ }),
784
+ applyA: (d, state) => {
785
+ const res = transformResult(null, /** @type {delta.Node<NodeName,any,any,any>} */ (node$1.node(name)));
786
+ _nodeApplyA(res, state, d, d);
787
+ return res
788
+ },
789
+ applyB: (d, state) => {
790
+ schema.assert(d, node$1.$nodeAny);
791
+ const res = transformResult(null, /** @type {delta.Node<NodeName,any,any,any>} */ (node$1.node(name)));
792
+ const childrenRes = d.children.ops.length === 0 ? transformResultEmpty : state.children.applyB(/** @type {delta.Array<any,any>} */(d.children));
793
+ const attrsRes = d.attributes._changes.size === 0 ? transformResultEmpty : state.attrs.applyB(d.attributes);
794
+ attrsRes.b && res.b.attributes.apply(attrsRes.b);
795
+ childrenRes.b && res.b.children.apply(/** @type {delta.Array<any,false>} */ (childrenRes.b));
796
+ res.a = abstract.mergeDeltas(attrsRes.a, childrenRes.a);
797
+ _nodeApplyA(res, state, childrenRes.a, attrsRes.a);
798
+ return res
799
+ }
800
+ }))
801
+ };
802
+
803
+ /**
804
+ * @template {{[k:string]:any}} KV
805
+ * @typedef {delta.Map<KV> | delta.Node<any,KV,any,any>} _FollowPath
806
+ */
807
+
808
+ /**
809
+ * @template {any} D
810
+ * @template {string[]} Path
811
+ * @typedef {Path extends []
812
+ * ? D
813
+ * : Path extends [infer P, ...infer PRest]
814
+ * ? (
815
+ * P extends string ? (D extends _AttrDeltaType<{ [K in P]: infer V }> ? QueryFollowPath<V,PRest extends string[] ? PRest : never> : never) : never
816
+ * )
817
+ * : never
818
+ * } QueryFollowPath
819
+ */
820
+
821
+ /**
822
+ * @template {{[k:string]:any}} Attrs
823
+ * @typedef {delta.Map<Partial<Attrs>> | delta.Node<any,Partial<Attrs>,any,any>} _AttrDeltaType
824
+ */
825
+
826
+ /**
827
+ * @template {Array<string>} Path
828
+ * @typedef {Path extends [infer P, ...infer PRest] ? (_AttrDeltaType<{ [K in (P extends string ? P : any)]: PathToDelta<PRest extends Array<string> ? PRest : any> }>) : any} PathToDelta
829
+ */
830
+
831
+ /**
832
+ * @template {Array<string>} Path
833
+ * @param {Path} path
834
+ * @return {<DA extends PathToDelta<Path>>($in: s.Schema<DA>) => Template<any, DA, delta.Value<QueryFollowPath<DA,Path>>>}
835
+ */
836
+ const query = (...path) => transformStatic(schema.$any, template({
837
+ $in: abstract.$delta,
838
+ $out: value.$valueAny,
839
+ state: () => null,
840
+ applyA: d => {
841
+ d = node$1.$nodeAny.check(d) ? d.attributes : d;
842
+ let cd = /** @type {delta.Map<any>?} */ (map$1.$mapAny.cast(d));
843
+ let overwritten = false;
844
+ for (let i = 0; i < path.length && cd != null; i++) {
845
+ if (map$1.$mapAny.check(cd)) {
846
+ const c = cd.get(path[i]);
847
+ if (ops.$insertOp.check(c)) {
848
+ overwritten = true;
849
+ cd = c.value;
850
+ } else if (ops.$deleteOp.check(c)) {
851
+ overwritten = true;
852
+ cd = null;
853
+ break
854
+ } else if (ops.$modifyOp.check(c)) {
855
+ cd = c.value;
856
+ }
857
+ } else {
858
+ cd = null;
859
+ }
860
+ }
861
+ const dv = value.value();
862
+ if (overwritten) {
863
+ // @todo implement some kind of "ValueDelta" with insert, delete, modify ops. dmap is supposed
864
+ // to automatically translate this.
865
+ if (cd == null) {
866
+ dv.delete();
867
+ } else {
868
+ dv.set(cd);
869
+ }
870
+ } else {
871
+ dv.modify(cd);
872
+ }
873
+ return transformResult(null, dv)
874
+ },
875
+ applyB: (d) => {
876
+ const dop = d.change;
877
+ let resD = map$1.map();
878
+ let i = path.length - 1;
879
+ const p = path[i];
880
+ if (ops.$modifyOp.check(dop)) {
881
+ resD.modify(p, dop.value);
882
+ } else if (ops.$insertOp.check(dop)) {
883
+ resD.set(p, dop.value);
884
+ } else if (ops.$deleteOp.check(dop)) {
885
+ resD.delete(p);
886
+ }
887
+ for (i--; i >= 0; i--) {
888
+ const tmpDmap = map$1.map();
889
+ tmpDmap.modify(p, resD);
890
+ resD = tmpDmap;
891
+ }
892
+ return /** @type {TransformResult<any,null>} */ (transformResult(resD, null))
893
+ }
894
+ }));
895
+
896
+ /**
897
+ * @template {delta.AbstractDelta} Delta
898
+ * @param {s.Schema<Delta>} $in
899
+ * @return {Template<null,Delta,Delta>}
900
+ */
901
+ const id = $in => template({
902
+ $in,
903
+ $out: $in,
904
+ state: () => null,
905
+ applyA: d => {
906
+ return transformResult(null, d)
907
+ },
908
+ applyB: d => {
909
+ return transformResult(d, null)
910
+ }
911
+ });
912
+
913
+ exports.$template = $template;
914
+ exports.$templateAny = $templateAny;
915
+ exports.Template = Template;
916
+ exports.Transformer = Transformer;
917
+ exports.array = array;
918
+ exports.fixed = fixed;
919
+ exports.id = id;
920
+ exports.map = map;
921
+ exports.maybeFixedToTemplate = maybeFixedToTemplate;
922
+ exports.node = node;
923
+ exports.pipe = pipe;
924
+ exports.query = query;
925
+ exports.template = template;
926
+ exports.transform = transform;
927
+ exports.transformResult = transformResult;
928
+ exports.transformResultEmpty = transformResultEmpty;
929
+ exports.transformStatic = transformStatic;
930
+ //# sourceMappingURL=transformer.cjs.map