lib0 0.2.115-4 → 0.2.115-6

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