mutts 1.0.9 → 1.0.11

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 (206) hide show
  1. package/README.md +60 -35
  2. package/dist/browser.cjs +1333 -1760
  3. package/dist/browser.cjs.map +1 -1
  4. package/dist/browser.d.ts +2 -1392
  5. package/dist/browser.dev.cjs +114 -0
  6. package/dist/browser.dev.cjs.map +1 -0
  7. package/dist/browser.dev.d.ts +2 -0
  8. package/dist/browser.dev.esm.js +5 -0
  9. package/dist/browser.dev.esm.js.map +1 -0
  10. package/dist/browser.esm.js +18 -97
  11. package/dist/browser.esm.js.map +1 -1
  12. package/dist/chunks/{async-browser-lvzLOCgk.cjs → async-browser-Dgr5CreQ.cjs} +16 -95
  13. package/dist/chunks/async-browser-Dgr5CreQ.cjs.map +1 -0
  14. package/dist/chunks/{async-node-C3DeIb0y.cjs → async-node-3PrbVAbB.cjs} +3 -1
  15. package/dist/chunks/async-node-3PrbVAbB.cjs.map +1 -0
  16. package/dist/chunks/index-Sf74wXTV.esm.js +2577 -0
  17. package/dist/chunks/index-Sf74wXTV.esm.js.map +1 -0
  18. package/dist/chunks/node-Bo7WU5S2.esm.js +96 -0
  19. package/dist/chunks/node-Bo7WU5S2.esm.js.map +1 -0
  20. package/dist/chunks/{index-VTO-b2vR.cjs → proxy-Cc79Lrzj.cjs} +2593 -3216
  21. package/dist/chunks/proxy-Cc79Lrzj.cjs.map +1 -0
  22. package/dist/chunks/{index-CtA2AWl3.esm.js → proxy-D2C49sXH.esm.js} +2570 -3174
  23. package/dist/chunks/proxy-D2C49sXH.esm.js.map +1 -0
  24. package/dist/debug.cjs +987 -28
  25. package/dist/debug.cjs.map +1 -1
  26. package/dist/debug.d.ts +37 -38
  27. package/dist/debug.esm.js +963 -1
  28. package/dist/debug.esm.js.map +1 -1
  29. package/dist/devtools/manifest.json +1 -1
  30. package/dist/devtools/panel.html +1 -1
  31. package/dist/devtools/panel.js +107 -94
  32. package/dist/devtools/panel.js.map +1 -1
  33. package/dist/index.d.ts +1322 -1
  34. package/dist/mutts.umd.js +6647 -1
  35. package/dist/mutts.umd.js.map +1 -1
  36. package/dist/mutts.umd.min.js +1 -1
  37. package/dist/mutts.umd.min.js.map +1 -1
  38. package/dist/node.cjs +69 -63
  39. package/dist/node.cjs.map +1 -1
  40. package/dist/node.d.ts +2 -2
  41. package/dist/node.dev.cjs +114 -0
  42. package/dist/node.dev.cjs.map +1 -0
  43. package/dist/node.dev.d.ts +2 -0
  44. package/dist/node.dev.esm.js +6 -0
  45. package/dist/node.dev.esm.js.map +1 -0
  46. package/dist/node.esm.js +4 -97
  47. package/dist/node.esm.js.map +1 -1
  48. package/dist/{types-DaHFfhlN.d.ts → types-Bx2PhORg.d.ts} +134 -88
  49. package/docs/ai/api-reference.md +11 -32
  50. package/docs/ai/manual.md +297 -239
  51. package/docs/reactive/advanced.md +318 -9
  52. package/docs/reactive/attend.md +2 -4
  53. package/docs/reactive/collections.md +22 -187
  54. package/docs/reactive/core.md +223 -131
  55. package/docs/reactive/debugging.md +119 -12
  56. package/docs/reactive/error-handling.md +10 -10
  57. package/docs/reactive/resource.md +125 -0
  58. package/docs/reactive.md +3 -4
  59. package/docs/utils.md +70 -0
  60. package/docs/zone.md +1 -1
  61. package/package.json +76 -38
  62. package/dist/chunks/async-browser-lvzLOCgk.cjs.map +0 -1
  63. package/dist/chunks/async-node-C3DeIb0y.cjs.map +0 -1
  64. package/dist/chunks/index-2vea86wD.esm.js +0 -3011
  65. package/dist/chunks/index-2vea86wD.esm.js.map +0 -1
  66. package/dist/chunks/index-CtA2AWl3.esm.js.map +0 -1
  67. package/dist/chunks/index-VTO-b2vR.cjs.map +0 -1
  68. package/dist/debug/debug.d.ts +0 -122
  69. package/dist/debug/debug.d.ts.map +0 -1
  70. package/dist/debug/index.d.ts +0 -4
  71. package/dist/debug/index.d.ts.map +0 -1
  72. package/dist/debug/lineage-panel.d.ts +0 -5
  73. package/dist/debug/lineage-panel.d.ts.map +0 -1
  74. package/dist/debug/lineage.d.ts +0 -79
  75. package/dist/debug/lineage.d.ts.map +0 -1
  76. package/dist/src/async/browser.d.ts +0 -2
  77. package/dist/src/async/browser.d.ts.map +0 -1
  78. package/dist/src/async/index.d.ts +0 -19
  79. package/dist/src/async/index.d.ts.map +0 -1
  80. package/dist/src/async/node.d.ts +0 -2
  81. package/dist/src/async/node.d.ts.map +0 -1
  82. package/dist/src/decorator.d.ts +0 -106
  83. package/dist/src/decorator.d.ts.map +0 -1
  84. package/dist/src/destroyable.d.ts +0 -87
  85. package/dist/src/destroyable.d.ts.map +0 -1
  86. package/dist/src/entry-browser.d.ts +0 -3
  87. package/dist/src/entry-browser.d.ts.map +0 -1
  88. package/dist/src/entry-node.d.ts +0 -3
  89. package/dist/src/entry-node.d.ts.map +0 -1
  90. package/dist/src/eventful.d.ts +0 -20
  91. package/dist/src/eventful.d.ts.map +0 -1
  92. package/dist/src/flavored.d.ts +0 -33
  93. package/dist/src/flavored.d.ts.map +0 -1
  94. package/dist/src/index.d.ts +0 -14
  95. package/dist/src/index.d.ts.map +0 -1
  96. package/dist/src/indexable.d.ts +0 -243
  97. package/dist/src/indexable.d.ts.map +0 -1
  98. package/dist/src/introspection.d.ts +0 -27
  99. package/dist/src/introspection.d.ts.map +0 -1
  100. package/dist/src/iterableWeak.d.ts +0 -53
  101. package/dist/src/iterableWeak.d.ts.map +0 -1
  102. package/dist/src/mixins.d.ts +0 -25
  103. package/dist/src/mixins.d.ts.map +0 -1
  104. package/dist/src/promiseChain.d.ts +0 -20
  105. package/dist/src/promiseChain.d.ts.map +0 -1
  106. package/dist/src/reactive/array.d.ts +0 -48
  107. package/dist/src/reactive/array.d.ts.map +0 -1
  108. package/dist/src/reactive/buffer.d.ts +0 -120
  109. package/dist/src/reactive/buffer.d.ts.map +0 -1
  110. package/dist/src/reactive/change.d.ts +0 -29
  111. package/dist/src/reactive/change.d.ts.map +0 -1
  112. package/dist/src/reactive/deep-touch.d.ts +0 -28
  113. package/dist/src/reactive/deep-touch.d.ts.map +0 -1
  114. package/dist/src/reactive/deep-watch-state.d.ts +0 -25
  115. package/dist/src/reactive/deep-watch-state.d.ts.map +0 -1
  116. package/dist/src/reactive/deep-watch.d.ts +0 -20
  117. package/dist/src/reactive/deep-watch.d.ts.map +0 -1
  118. package/dist/src/reactive/describe.d.ts +0 -12
  119. package/dist/src/reactive/describe.d.ts.map +0 -1
  120. package/dist/src/reactive/effect-context.d.ts +0 -34
  121. package/dist/src/reactive/effect-context.d.ts.map +0 -1
  122. package/dist/src/reactive/effects.d.ts +0 -164
  123. package/dist/src/reactive/effects.d.ts.map +0 -1
  124. package/dist/src/reactive/index.d.ts +0 -19
  125. package/dist/src/reactive/index.d.ts.map +0 -1
  126. package/dist/src/reactive/map.d.ts +0 -28
  127. package/dist/src/reactive/map.d.ts.map +0 -1
  128. package/dist/src/reactive/memoize.d.ts +0 -28
  129. package/dist/src/reactive/memoize.d.ts.map +0 -1
  130. package/dist/src/reactive/non-reactive-state.d.ts +0 -9
  131. package/dist/src/reactive/non-reactive-state.d.ts.map +0 -1
  132. package/dist/src/reactive/non-reactive.d.ts +0 -11
  133. package/dist/src/reactive/non-reactive.d.ts.map +0 -1
  134. package/dist/src/reactive/project.d.ts +0 -40
  135. package/dist/src/reactive/project.d.ts.map +0 -1
  136. package/dist/src/reactive/proxy-state.d.ts +0 -8
  137. package/dist/src/reactive/proxy-state.d.ts.map +0 -1
  138. package/dist/src/reactive/proxy.d.ts +0 -23
  139. package/dist/src/reactive/proxy.d.ts.map +0 -1
  140. package/dist/src/reactive/record.d.ts +0 -115
  141. package/dist/src/reactive/record.d.ts.map +0 -1
  142. package/dist/src/reactive/register.d.ts +0 -125
  143. package/dist/src/reactive/register.d.ts.map +0 -1
  144. package/dist/src/reactive/registry.d.ts +0 -21
  145. package/dist/src/reactive/registry.d.ts.map +0 -1
  146. package/dist/src/reactive/set.d.ts +0 -26
  147. package/dist/src/reactive/set.d.ts.map +0 -1
  148. package/dist/src/reactive/tracking.d.ts +0 -7
  149. package/dist/src/reactive/tracking.d.ts.map +0 -1
  150. package/dist/src/reactive/types.d.ts +0 -424
  151. package/dist/src/reactive/types.d.ts.map +0 -1
  152. package/dist/src/reactive/watch.d.ts +0 -48
  153. package/dist/src/reactive/watch.d.ts.map +0 -1
  154. package/dist/src/std-decorators.d.ts +0 -45
  155. package/dist/src/std-decorators.d.ts.map +0 -1
  156. package/dist/src/utils.d.ts +0 -49
  157. package/dist/src/utils.d.ts.map +0 -1
  158. package/dist/src/zone.d.ts +0 -40
  159. package/dist/src/zone.d.ts.map +0 -1
  160. package/docs/reactive/describe.md +0 -85
  161. package/docs/reactive/project.md +0 -93
  162. package/docs/reactive/scan.md +0 -293
  163. package/src/async/browser.ts +0 -323
  164. package/src/async/index.ts +0 -27
  165. package/src/async/node.ts +0 -92
  166. package/src/decorator.ts +0 -272
  167. package/src/destroyable.ts +0 -199
  168. package/src/entry-browser.ts +0 -5
  169. package/src/entry-node.ts +0 -5
  170. package/src/eventful.ts +0 -110
  171. package/src/flavored.ts +0 -106
  172. package/src/index.d.ts +0 -12
  173. package/src/index.ts +0 -64
  174. package/src/indexable.ts +0 -526
  175. package/src/introspection.ts +0 -59
  176. package/src/iterableWeak.ts +0 -233
  177. package/src/mixins.ts +0 -123
  178. package/src/promiseChain.ts +0 -110
  179. package/src/reactive/array.ts +0 -500
  180. package/src/reactive/buffer.ts +0 -328
  181. package/src/reactive/change.ts +0 -131
  182. package/src/reactive/deep-touch.ts +0 -273
  183. package/src/reactive/deep-watch-state.ts +0 -82
  184. package/src/reactive/deep-watch.ts +0 -171
  185. package/src/reactive/describe.ts +0 -39
  186. package/src/reactive/effect-context.ts +0 -83
  187. package/src/reactive/effects.ts +0 -1434
  188. package/src/reactive/index.ts +0 -72
  189. package/src/reactive/map.ts +0 -142
  190. package/src/reactive/memoize.ts +0 -186
  191. package/src/reactive/non-reactive-state.ts +0 -49
  192. package/src/reactive/non-reactive.ts +0 -43
  193. package/src/reactive/project.md +0 -107
  194. package/src/reactive/project.ts +0 -430
  195. package/src/reactive/proxy-state.ts +0 -27
  196. package/src/reactive/proxy.ts +0 -282
  197. package/src/reactive/record.ts +0 -181
  198. package/src/reactive/register.ts +0 -538
  199. package/src/reactive/registry.ts +0 -72
  200. package/src/reactive/set.ts +0 -117
  201. package/src/reactive/tracking.ts +0 -41
  202. package/src/reactive/types.ts +0 -520
  203. package/src/reactive/watch.ts +0 -180
  204. package/src/std-decorators.ts +0 -256
  205. package/src/utils.ts +0 -300
  206. package/src/zone.ts +0 -142
@@ -1,500 +0,0 @@
1
- import { FoolProof } from '../utils'
2
- import { touched } from './change'
3
- import { makeReactiveEntriesIterator, makeReactiveIterator } from './non-reactive'
4
- import { reactive } from './proxy'
5
- import { unwrap } from './proxy-state'
6
- import { dependant } from './tracking'
7
-
8
- function* index(i: number, { length = true } = {}): IterableIterator<number | 'length'> {
9
- if (length) yield 'length'
10
- yield i
11
- }
12
-
13
- function* range(
14
- a: number,
15
- b: number,
16
- { length = false } = {}
17
- ): IterableIterator<number | 'length'> {
18
- const start = Math.min(a, b)
19
- const end = Math.max(a, b)
20
- if (length) yield 'length'
21
- for (let i = start; i <= end; i++) yield i
22
- }
23
- export abstract class Indexer extends Array {
24
- get(i: number): any {
25
- dependant(this, i)
26
- return reactive(this[i])
27
- }
28
- // Returns undefined intentionally: signals the proxy handler that notifications
29
- // were already dispatched via touched(), preventing double notification
30
- set(i: number, value: any) {
31
- const added = i >= this.length
32
- this[i] = value
33
- touched(this, { type: 'set', prop: i }, index(i, { length: added }))
34
- }
35
- }
36
- const indexLess = { get: FoolProof.get, set: FoolProof.set }
37
- Object.assign(FoolProof, {
38
- get(obj: any, prop: any, receiver: any) {
39
- if (obj instanceof Array && typeof prop === 'string') {
40
- const index = parseInt(prop)
41
- if (!Number.isNaN(index)) return Indexer.prototype.get.call(obj, index)
42
- }
43
- return indexLess.get(obj, prop, receiver)
44
- },
45
- set(obj: any, prop: any, value: any, receiver: any) {
46
- if (obj instanceof Array && typeof prop === 'string') {
47
- const index = parseInt(prop)
48
- if (!Number.isNaN(index)) return Indexer.prototype.set.call(obj, index, value)
49
- }
50
- return indexLess.set(obj, prop, value, receiver)
51
- },
52
- })
53
-
54
- export abstract class ReactiveArray extends Array {
55
- toJSON() {
56
- return this
57
- }
58
- get length(): number {
59
- dependant(this, 'length')
60
- return this.length
61
- }
62
- set length(value: number) {
63
- const oldLength = this.length
64
- if (oldLength === value) return
65
- try {
66
- this.length = value
67
- } finally {
68
- touched(this, { type: 'set', prop: 'length' }, range(oldLength, value, { length: true }))
69
- }
70
- }
71
- // Safe array access with negative indices
72
- at(index: number): any {
73
- const actualIndex = index < 0 ? this.length + index : index
74
- dependant(this, actualIndex)
75
- if (index < 0) dependant(this, 'length')
76
- if (actualIndex < 0 || actualIndex >= this.length) return undefined
77
- return reactive(this[actualIndex])
78
- }
79
-
80
- // Immutable versions of mutator methods
81
- toReversed(): any[] {
82
- dependant(this)
83
- return reactive(this.toReversed())
84
- }
85
-
86
- toSorted(compareFn?: (a: any, b: any) => number): any[] {
87
- dependant(this)
88
- return reactive(this.toSorted(compareFn))
89
- }
90
-
91
- toSpliced(start: number, deleteCount?: number, ...items: any[]): any[] {
92
- dependant(this)
93
- return deleteCount === undefined
94
- ? this.toSpliced(start)
95
- : this.toSpliced(start, deleteCount, ...items)
96
- }
97
-
98
- with(index: number, value: any): any[] {
99
- dependant(this)
100
- return reactive(this.with(index, value))
101
- }
102
-
103
- // Iterator methods with reactivity tracking
104
- entries(): any {
105
- dependant(this)
106
- return makeReactiveEntriesIterator(this.entries())
107
- }
108
-
109
- keys(): any {
110
- dependant(this, 'length')
111
- return this.keys()
112
- }
113
-
114
- values(): any {
115
- dependant(this)
116
- return makeReactiveIterator(this.values())
117
- }
118
-
119
- [Symbol.iterator](): ArrayIterator<any> {
120
- dependant(this)
121
- const nativeIterator = this[Symbol.iterator]()
122
- return {
123
- next() {
124
- const result = nativeIterator.next()
125
- if (result.done) {
126
- return result
127
- }
128
- return { value: reactive(result.value), done: false }
129
- },
130
- [Symbol.iterator]() {
131
- return this
132
- },
133
- [Symbol.dispose]() {},
134
- } as any
135
- }
136
-
137
- indexOf(searchElement: any, fromIndex?: number): number {
138
- const length = this.length
139
- let i = fromIndex === undefined ? 0 : fromIndex
140
- if (i < 0) i = Math.max(length + i, 0)
141
-
142
- const unwrappedSearch = unwrap(searchElement)
143
-
144
- for (; i < length; i++) {
145
- dependant(this, i)
146
- const item = this[i]
147
- if (item === searchElement || item === unwrappedSearch || unwrap(item) === unwrappedSearch) {
148
- return i
149
- }
150
- }
151
-
152
- dependant(this, 'length')
153
- return -1
154
- }
155
-
156
- lastIndexOf(searchElement: any, fromIndex?: number): number {
157
- const length = this.length
158
- let i = fromIndex === undefined ? length - 1 : fromIndex
159
- if (i >= length) i = length - 1
160
- if (i < 0) i = Math.max(length + i, -1) // -1 ensures loop condition i >= 0 works correctly
161
-
162
- const unwrappedSearch = unwrap(searchElement)
163
-
164
- for (; i >= 0; i--) {
165
- dependant(this, i)
166
- const item = this[i]
167
- if (item === searchElement || item === unwrappedSearch || unwrap(item) === unwrappedSearch) {
168
- return i
169
- }
170
- }
171
-
172
- // If we scanned the whole relevant part and didn't find it, we depend on length
173
- // (because adding elements might shift indices or add the element)
174
- // Actually for lastIndexOf, if we start from end, length dependency is implicit in the start index calculation?
175
- // But if we return -1, it means we didn't find it.
176
- // If we push an element, should lastIndexOf update?
177
- // Yes, if the new element is the one we are looking for.
178
- dependant(this, 'length')
179
- return -1
180
- }
181
-
182
- includes(searchElement: any, fromIndex?: number): boolean {
183
- return this.indexOf(searchElement, fromIndex) !== -1
184
- }
185
-
186
- find(predicate: (this: any, value: any, index: number, obj: any[]) => boolean, thisArg?: any): any
187
- find(searchElement: any, fromIndex?: number): any
188
- find(predicateOrElement: any, thisArg?: any): any {
189
- if (typeof predicateOrElement === 'function') {
190
- const predicate = predicateOrElement as (
191
- this: any,
192
- value: any,
193
- index: number,
194
- obj: any[]
195
- ) => boolean
196
- const length = this.length
197
-
198
- for (let i = 0; i < length; i++) {
199
- dependant(this, i)
200
- const val = reactive(this[i])
201
- if (predicate.call(thisArg, val, i, this)) {
202
- return val
203
- }
204
- }
205
-
206
- dependant(this, 'length')
207
- return undefined
208
- }
209
- const fromIndex = typeof thisArg === 'number' ? thisArg : undefined
210
- const index = this.indexOf(predicateOrElement, fromIndex)
211
- if (index === -1) return undefined
212
- return reactive(this[index])
213
- }
214
-
215
- findIndex(
216
- predicate: (this: any, value: any, index: number, obj: any[]) => boolean,
217
- thisArg?: any
218
- ): number
219
- findIndex(searchElement: any, fromIndex?: number): number
220
- findIndex(predicateOrElement: any, thisArg?: any): number {
221
- if (typeof predicateOrElement === 'function') {
222
- const predicate = predicateOrElement as (
223
- this: any,
224
- value: any,
225
- index: number,
226
- obj: any[]
227
- ) => boolean
228
- const length = this.length
229
-
230
- for (let i = 0; i < length; i++) {
231
- dependant(this, i)
232
- const val = reactive(this[i])
233
- if (predicate.call(thisArg, val, i, this)) {
234
- return i
235
- }
236
- }
237
-
238
- dependant(this, 'length')
239
- return -1
240
- }
241
- const fromIndex = typeof thisArg === 'number' ? thisArg : undefined
242
- return this.indexOf(predicateOrElement, fromIndex)
243
- }
244
-
245
- flat(depth?: number): any[] {
246
- dependant(this)
247
- return reactive(depth === undefined ? this.flat() : this.flat(depth))
248
- }
249
-
250
- flatMap(
251
- callbackfn: (this: any, value: any, index: number, array: any[]) => any[],
252
- thisArg?: any
253
- ): any[] {
254
- dependant(this)
255
- return reactive(
256
- this.flatMap(
257
- (item, index, array) => callbackfn.call(thisArg, reactive(item), index, array),
258
- thisArg
259
- )
260
- )
261
- }
262
-
263
- filter(callbackfn: (value: any, index: number, array: any[]) => boolean, thisArg?: any): any[] {
264
- dependant(this)
265
- return reactive(
266
- this.filter((item, index, array) => callbackfn(reactive(item), index, array), thisArg)
267
- )
268
- }
269
-
270
- map(callbackfn: (value: any, index: number, array: any[]) => any, thisArg?: any): any[] {
271
- dependant(this)
272
- return reactive(
273
- this.map((item, index, array) => callbackfn(reactive(item), index, array), thisArg)
274
- )
275
- }
276
-
277
- reduce(
278
- callbackfn: (previousValue: any, currentValue: any, currentIndex: number, array: any[]) => any,
279
- initialValue?: any
280
- ): any {
281
- dependant(this)
282
- const result =
283
- initialValue === undefined
284
- ? this.reduce(callbackfn as any)
285
- : this.reduce(callbackfn as any, initialValue)
286
- return reactive(result)
287
- }
288
-
289
- reduceRight(
290
- callbackfn: (previousValue: any, currentValue: any, currentIndex: number, array: any[]) => any,
291
- initialValue?: any
292
- ): any {
293
- dependant(this)
294
- const result =
295
- initialValue !== undefined
296
- ? this.reduceRight(callbackfn as any, initialValue)
297
- : (this as any).reduceRight(callbackfn as any)
298
- return reactive(result)
299
- }
300
-
301
- slice(start?: number, end?: number): any[] {
302
- for (const i of range(start || 0, end || this.length - 1)) dependant(this, i)
303
- return start === undefined
304
- ? this.slice()
305
- : end === undefined
306
- ? this.slice(start)
307
- : this.slice(start, end)
308
- }
309
-
310
- concat(...items: any[]): any[] {
311
- dependant(this)
312
- return reactive(this.concat(...items))
313
- }
314
-
315
- join(separator?: string): string {
316
- dependant(this)
317
- return this.join(separator as any)
318
- }
319
-
320
- forEach(callbackfn: (value: any, index: number, array: any[]) => void, thisArg?: any): void {
321
- dependant(this)
322
- this.forEach((value, index, array) => {
323
- callbackfn.call(thisArg, reactive(value), index, array)
324
- })
325
- }
326
-
327
- // no need to make it dependant on indexes after the found one
328
- every<S>(
329
- predicate: (value: any, index: number, array: any[]) => value is S,
330
- thisArg?: any
331
- ): this is S[]
332
- every(callbackfn: (value: any, index: number, array: any[]) => boolean, thisArg?: any): boolean
333
- every(callbackfn: (value: any, index: number, array: any[]) => boolean, thisArg?: any): boolean {
334
- const length = this.length
335
-
336
- for (let i = 0; i < length; i++) {
337
- dependant(this, i)
338
- if (!callbackfn.call(thisArg, reactive(this[i]), i, this)) {
339
- return false
340
- }
341
- }
342
-
343
- dependant(this, 'length')
344
- return true
345
- }
346
-
347
- some(callbackfn: (value: any, index: number, array: any[]) => boolean, thisArg?: any): boolean {
348
- const length = this.length
349
-
350
- for (let i = 0; i < length; i++) {
351
- dependant(this, i)
352
- if (callbackfn.call(thisArg, reactive(this[i]), i, this)) {
353
- return true
354
- }
355
- }
356
-
357
- dependant(this, 'length')
358
- return false
359
- }
360
- // Side-effectful
361
- push(...items: any[]): number {
362
- const oldLength = this.length
363
- try {
364
- return this.push(...items)
365
- } finally {
366
- touched(
367
- this,
368
- { type: 'bunch', method: 'push' },
369
- range(oldLength, oldLength + items.length - 1, { length: true })
370
- )
371
- }
372
- }
373
-
374
- pop(): any {
375
- if (this.length === 0) return undefined
376
- try {
377
- return reactive(this.pop())
378
- } finally {
379
- touched(this, { type: 'bunch', method: 'pop' }, index(this.length))
380
- }
381
- }
382
-
383
- shift(): any {
384
- if (this.length === 0) return undefined
385
- try {
386
- return reactive(this.shift())
387
- } finally {
388
- touched(this, { type: 'bunch', method: 'shift' }, range(0, this.length + 1, { length: true }))
389
- }
390
- }
391
-
392
- unshift(...items: any[]): number {
393
- try {
394
- return this.unshift(...items)
395
- } finally {
396
- touched(
397
- this,
398
- { type: 'bunch', method: 'unshift' },
399
- range(0, this.length - items.length, { length: true })
400
- )
401
- }
402
- }
403
-
404
- splice(start: number, deleteCount?: number, ...items: any[]): any[] {
405
- const oldLength = this.length
406
-
407
- // Normalize start index
408
- let actualStart = start
409
- if (actualStart < 0) actualStart = Math.max(oldLength + actualStart, 0)
410
- else actualStart = Math.min(actualStart, oldLength)
411
-
412
- // Normalize deleteCount
413
- let actualDeleteCount = deleteCount
414
- if (actualDeleteCount === undefined) {
415
- actualDeleteCount = oldLength - actualStart
416
- } else {
417
- actualDeleteCount = Math.max(0, Math.min(actualDeleteCount, oldLength - actualStart))
418
- }
419
-
420
- try {
421
- if (deleteCount === undefined) return reactive(this.splice(start))
422
- return reactive(this.splice(start, deleteCount, ...items))
423
- } finally {
424
- touched(
425
- this,
426
- { type: 'bunch', method: 'splice' },
427
- actualDeleteCount === items.length
428
- ? range(actualStart, actualStart + actualDeleteCount - 1)
429
- : range(actualStart, oldLength + Math.max(items.length - actualDeleteCount, 0), {
430
- length: true,
431
- })
432
- )
433
- }
434
- }
435
-
436
- reverse(): any[] {
437
- try {
438
- return this.reverse()
439
- } finally {
440
- touched(this, { type: 'bunch', method: 'reverse' }, range(0, this.length - 1))
441
- }
442
- }
443
-
444
- sort(compareFn?: (a: any, b: any) => number): this {
445
- compareFn = compareFn || ((a, b) => a.toString().localeCompare(b.toString()))
446
- try {
447
- return this.sort((a, b) => compareFn(reactive(a), reactive(b))) as any
448
- } finally {
449
- touched(this, { type: 'bunch', method: 'sort' }, range(0, this.length - 1))
450
- }
451
- }
452
-
453
- fill(value: any, start?: number, end?: number): this {
454
- const len = this.length
455
- let k = start === undefined ? 0 : start
456
- if (k < 0) k = Math.max(len + k, 0)
457
- else k = Math.min(k, len)
458
-
459
- let final = end === undefined ? len : end
460
- if (final < 0) final = Math.max(len + final, 0)
461
- else final = Math.min(final, len)
462
-
463
- try {
464
- if (start === undefined) return this.fill(value) as any
465
- if (end === undefined) return this.fill(value, start) as any
466
- return this.fill(value, start, end) as any
467
- } finally {
468
- if (final > k) {
469
- touched(this, { type: 'bunch', method: 'fill' }, range(k, final - 1))
470
- }
471
- }
472
- }
473
-
474
- copyWithin(target: number, start: number, end?: number): this {
475
- try {
476
- if (end === undefined) return this.copyWithin(target, start) as any
477
- return this.copyWithin(target, start, end) as any
478
- } finally {
479
- const len = this.length
480
-
481
- let to = target
482
- if (to < 0) to = Math.max(len + to, 0)
483
- else if (to >= len) to = len
484
-
485
- let from = start
486
- if (from < 0) from = Math.max(len + from, 0)
487
- else if (from >= len) from = len
488
-
489
- let final = end === undefined ? len : end
490
- if (final < 0) final = Math.max(len + final, 0)
491
- else if (final >= len) final = len
492
-
493
- const count = Math.min(final - from, len - to)
494
-
495
- if (count > 0) {
496
- touched(this, { type: 'bunch', method: 'copyWithin' }, range(to, to + count - 1))
497
- }
498
- }
499
- }
500
- }