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.
- package/README.md +60 -35
- package/dist/browser.cjs +1333 -1760
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.d.ts +2 -1392
- package/dist/browser.dev.cjs +114 -0
- package/dist/browser.dev.cjs.map +1 -0
- package/dist/browser.dev.d.ts +2 -0
- package/dist/browser.dev.esm.js +5 -0
- package/dist/browser.dev.esm.js.map +1 -0
- package/dist/browser.esm.js +18 -97
- package/dist/browser.esm.js.map +1 -1
- package/dist/chunks/{async-browser-lvzLOCgk.cjs → async-browser-Dgr5CreQ.cjs} +16 -95
- package/dist/chunks/async-browser-Dgr5CreQ.cjs.map +1 -0
- package/dist/chunks/{async-node-C3DeIb0y.cjs → async-node-3PrbVAbB.cjs} +3 -1
- package/dist/chunks/async-node-3PrbVAbB.cjs.map +1 -0
- package/dist/chunks/index-Sf74wXTV.esm.js +2577 -0
- package/dist/chunks/index-Sf74wXTV.esm.js.map +1 -0
- package/dist/chunks/node-Bo7WU5S2.esm.js +96 -0
- package/dist/chunks/node-Bo7WU5S2.esm.js.map +1 -0
- package/dist/chunks/{index-VTO-b2vR.cjs → proxy-Cc79Lrzj.cjs} +2593 -3216
- package/dist/chunks/proxy-Cc79Lrzj.cjs.map +1 -0
- package/dist/chunks/{index-CtA2AWl3.esm.js → proxy-D2C49sXH.esm.js} +2570 -3174
- package/dist/chunks/proxy-D2C49sXH.esm.js.map +1 -0
- package/dist/debug.cjs +987 -28
- package/dist/debug.cjs.map +1 -1
- package/dist/debug.d.ts +37 -38
- package/dist/debug.esm.js +963 -1
- package/dist/debug.esm.js.map +1 -1
- package/dist/devtools/manifest.json +1 -1
- package/dist/devtools/panel.html +1 -1
- package/dist/devtools/panel.js +107 -94
- package/dist/devtools/panel.js.map +1 -1
- package/dist/index.d.ts +1322 -1
- package/dist/mutts.umd.js +6647 -1
- package/dist/mutts.umd.js.map +1 -1
- package/dist/mutts.umd.min.js +1 -1
- package/dist/mutts.umd.min.js.map +1 -1
- package/dist/node.cjs +69 -63
- package/dist/node.cjs.map +1 -1
- package/dist/node.d.ts +2 -2
- package/dist/node.dev.cjs +114 -0
- package/dist/node.dev.cjs.map +1 -0
- package/dist/node.dev.d.ts +2 -0
- package/dist/node.dev.esm.js +6 -0
- package/dist/node.dev.esm.js.map +1 -0
- package/dist/node.esm.js +4 -97
- package/dist/node.esm.js.map +1 -1
- package/dist/{types-DaHFfhlN.d.ts → types-Bx2PhORg.d.ts} +134 -88
- package/docs/ai/api-reference.md +11 -32
- package/docs/ai/manual.md +297 -239
- package/docs/reactive/advanced.md +318 -9
- package/docs/reactive/attend.md +2 -4
- package/docs/reactive/collections.md +22 -187
- package/docs/reactive/core.md +223 -131
- package/docs/reactive/debugging.md +119 -12
- package/docs/reactive/error-handling.md +10 -10
- package/docs/reactive/resource.md +125 -0
- package/docs/reactive.md +3 -4
- package/docs/utils.md +70 -0
- package/docs/zone.md +1 -1
- package/package.json +76 -38
- package/dist/chunks/async-browser-lvzLOCgk.cjs.map +0 -1
- package/dist/chunks/async-node-C3DeIb0y.cjs.map +0 -1
- package/dist/chunks/index-2vea86wD.esm.js +0 -3011
- package/dist/chunks/index-2vea86wD.esm.js.map +0 -1
- package/dist/chunks/index-CtA2AWl3.esm.js.map +0 -1
- package/dist/chunks/index-VTO-b2vR.cjs.map +0 -1
- package/dist/debug/debug.d.ts +0 -122
- package/dist/debug/debug.d.ts.map +0 -1
- package/dist/debug/index.d.ts +0 -4
- package/dist/debug/index.d.ts.map +0 -1
- package/dist/debug/lineage-panel.d.ts +0 -5
- package/dist/debug/lineage-panel.d.ts.map +0 -1
- package/dist/debug/lineage.d.ts +0 -79
- package/dist/debug/lineage.d.ts.map +0 -1
- package/dist/src/async/browser.d.ts +0 -2
- package/dist/src/async/browser.d.ts.map +0 -1
- package/dist/src/async/index.d.ts +0 -19
- package/dist/src/async/index.d.ts.map +0 -1
- package/dist/src/async/node.d.ts +0 -2
- package/dist/src/async/node.d.ts.map +0 -1
- package/dist/src/decorator.d.ts +0 -106
- package/dist/src/decorator.d.ts.map +0 -1
- package/dist/src/destroyable.d.ts +0 -87
- package/dist/src/destroyable.d.ts.map +0 -1
- package/dist/src/entry-browser.d.ts +0 -3
- package/dist/src/entry-browser.d.ts.map +0 -1
- package/dist/src/entry-node.d.ts +0 -3
- package/dist/src/entry-node.d.ts.map +0 -1
- package/dist/src/eventful.d.ts +0 -20
- package/dist/src/eventful.d.ts.map +0 -1
- package/dist/src/flavored.d.ts +0 -33
- package/dist/src/flavored.d.ts.map +0 -1
- package/dist/src/index.d.ts +0 -14
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/indexable.d.ts +0 -243
- package/dist/src/indexable.d.ts.map +0 -1
- package/dist/src/introspection.d.ts +0 -27
- package/dist/src/introspection.d.ts.map +0 -1
- package/dist/src/iterableWeak.d.ts +0 -53
- package/dist/src/iterableWeak.d.ts.map +0 -1
- package/dist/src/mixins.d.ts +0 -25
- package/dist/src/mixins.d.ts.map +0 -1
- package/dist/src/promiseChain.d.ts +0 -20
- package/dist/src/promiseChain.d.ts.map +0 -1
- package/dist/src/reactive/array.d.ts +0 -48
- package/dist/src/reactive/array.d.ts.map +0 -1
- package/dist/src/reactive/buffer.d.ts +0 -120
- package/dist/src/reactive/buffer.d.ts.map +0 -1
- package/dist/src/reactive/change.d.ts +0 -29
- package/dist/src/reactive/change.d.ts.map +0 -1
- package/dist/src/reactive/deep-touch.d.ts +0 -28
- package/dist/src/reactive/deep-touch.d.ts.map +0 -1
- package/dist/src/reactive/deep-watch-state.d.ts +0 -25
- package/dist/src/reactive/deep-watch-state.d.ts.map +0 -1
- package/dist/src/reactive/deep-watch.d.ts +0 -20
- package/dist/src/reactive/deep-watch.d.ts.map +0 -1
- package/dist/src/reactive/describe.d.ts +0 -12
- package/dist/src/reactive/describe.d.ts.map +0 -1
- package/dist/src/reactive/effect-context.d.ts +0 -34
- package/dist/src/reactive/effect-context.d.ts.map +0 -1
- package/dist/src/reactive/effects.d.ts +0 -164
- package/dist/src/reactive/effects.d.ts.map +0 -1
- package/dist/src/reactive/index.d.ts +0 -19
- package/dist/src/reactive/index.d.ts.map +0 -1
- package/dist/src/reactive/map.d.ts +0 -28
- package/dist/src/reactive/map.d.ts.map +0 -1
- package/dist/src/reactive/memoize.d.ts +0 -28
- package/dist/src/reactive/memoize.d.ts.map +0 -1
- package/dist/src/reactive/non-reactive-state.d.ts +0 -9
- package/dist/src/reactive/non-reactive-state.d.ts.map +0 -1
- package/dist/src/reactive/non-reactive.d.ts +0 -11
- package/dist/src/reactive/non-reactive.d.ts.map +0 -1
- package/dist/src/reactive/project.d.ts +0 -40
- package/dist/src/reactive/project.d.ts.map +0 -1
- package/dist/src/reactive/proxy-state.d.ts +0 -8
- package/dist/src/reactive/proxy-state.d.ts.map +0 -1
- package/dist/src/reactive/proxy.d.ts +0 -23
- package/dist/src/reactive/proxy.d.ts.map +0 -1
- package/dist/src/reactive/record.d.ts +0 -115
- package/dist/src/reactive/record.d.ts.map +0 -1
- package/dist/src/reactive/register.d.ts +0 -125
- package/dist/src/reactive/register.d.ts.map +0 -1
- package/dist/src/reactive/registry.d.ts +0 -21
- package/dist/src/reactive/registry.d.ts.map +0 -1
- package/dist/src/reactive/set.d.ts +0 -26
- package/dist/src/reactive/set.d.ts.map +0 -1
- package/dist/src/reactive/tracking.d.ts +0 -7
- package/dist/src/reactive/tracking.d.ts.map +0 -1
- package/dist/src/reactive/types.d.ts +0 -424
- package/dist/src/reactive/types.d.ts.map +0 -1
- package/dist/src/reactive/watch.d.ts +0 -48
- package/dist/src/reactive/watch.d.ts.map +0 -1
- package/dist/src/std-decorators.d.ts +0 -45
- package/dist/src/std-decorators.d.ts.map +0 -1
- package/dist/src/utils.d.ts +0 -49
- package/dist/src/utils.d.ts.map +0 -1
- package/dist/src/zone.d.ts +0 -40
- package/dist/src/zone.d.ts.map +0 -1
- package/docs/reactive/describe.md +0 -85
- package/docs/reactive/project.md +0 -93
- package/docs/reactive/scan.md +0 -293
- package/src/async/browser.ts +0 -323
- package/src/async/index.ts +0 -27
- package/src/async/node.ts +0 -92
- package/src/decorator.ts +0 -272
- package/src/destroyable.ts +0 -199
- package/src/entry-browser.ts +0 -5
- package/src/entry-node.ts +0 -5
- package/src/eventful.ts +0 -110
- package/src/flavored.ts +0 -106
- package/src/index.d.ts +0 -12
- package/src/index.ts +0 -64
- package/src/indexable.ts +0 -526
- package/src/introspection.ts +0 -59
- package/src/iterableWeak.ts +0 -233
- package/src/mixins.ts +0 -123
- package/src/promiseChain.ts +0 -110
- package/src/reactive/array.ts +0 -500
- package/src/reactive/buffer.ts +0 -328
- package/src/reactive/change.ts +0 -131
- package/src/reactive/deep-touch.ts +0 -273
- package/src/reactive/deep-watch-state.ts +0 -82
- package/src/reactive/deep-watch.ts +0 -171
- package/src/reactive/describe.ts +0 -39
- package/src/reactive/effect-context.ts +0 -83
- package/src/reactive/effects.ts +0 -1434
- package/src/reactive/index.ts +0 -72
- package/src/reactive/map.ts +0 -142
- package/src/reactive/memoize.ts +0 -186
- package/src/reactive/non-reactive-state.ts +0 -49
- package/src/reactive/non-reactive.ts +0 -43
- package/src/reactive/project.md +0 -107
- package/src/reactive/project.ts +0 -430
- package/src/reactive/proxy-state.ts +0 -27
- package/src/reactive/proxy.ts +0 -282
- package/src/reactive/record.ts +0 -181
- package/src/reactive/register.ts +0 -538
- package/src/reactive/registry.ts +0 -72
- package/src/reactive/set.ts +0 -117
- package/src/reactive/tracking.ts +0 -41
- package/src/reactive/types.ts +0 -520
- package/src/reactive/watch.ts +0 -180
- package/src/std-decorators.ts +0 -256
- package/src/utils.ts +0 -300
- package/src/zone.ts +0 -142
package/src/reactive/array.ts
DELETED
|
@@ -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
|
-
}
|