@bodil/signal 0.3.5 → 0.4.1
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/dist/array.d.ts +149 -15
- package/dist/array.js +230 -53
- package/dist/array.js.map +1 -1
- package/dist/array.test.js +34 -1
- package/dist/array.test.js.map +1 -1
- package/dist/index.d.ts +1 -120
- package/dist/index.js +1 -197
- package/dist/index.js.map +1 -1
- package/dist/map.d.ts +130 -0
- package/dist/map.js +227 -0
- package/dist/map.js.map +1 -0
- package/dist/map.test.d.ts +1 -0
- package/dist/map.test.js +52 -0
- package/dist/map.test.js.map +1 -0
- package/dist/signal.d.ts +200 -0
- package/dist/signal.js +263 -0
- package/dist/signal.js.map +1 -0
- package/dist/signal.test.js +6 -6
- package/dist/signal.test.js.map +1 -1
- package/package.json +4 -1
- package/src/array.test.ts +36 -1
- package/src/array.ts +250 -67
- package/src/index.ts +1 -265
- package/src/map.test.ts +62 -0
- package/src/map.ts +263 -0
- package/src/signal.test.ts +7 -7
- package/src/signal.ts +361 -0
package/dist/array.d.ts
CHANGED
|
@@ -1,33 +1,167 @@
|
|
|
1
|
+
import type { Equals } from "@bodil/core/types";
|
|
1
2
|
import { type Option } from "@bodil/opt";
|
|
2
|
-
|
|
3
|
+
import * as Signal from "./signal";
|
|
4
|
+
declare const instance: unique symbol;
|
|
5
|
+
type InstanceProps<A> = {
|
|
6
|
+
array: Array<A>;
|
|
7
|
+
signal: Signal.State<null>;
|
|
8
|
+
equals?: (a: A, b: A) => boolean;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* A read-only view of a {@link Signal.Array}.
|
|
12
|
+
*
|
|
13
|
+
* This acts just like the {@link Signal.Array} it was created from, mirroring
|
|
14
|
+
* the current contents of the source array, but without the ability to modify
|
|
15
|
+
* it.
|
|
16
|
+
*/
|
|
17
|
+
export declare class ReadonlySignalArray<A> implements Iterable<A>, Equals {
|
|
18
|
+
/** @ignore */
|
|
19
|
+
protected readonly [instance]: InstanceProps<A>;
|
|
20
|
+
/** @ignore */
|
|
21
|
+
protected constructor(instanceProps: InstanceProps<A>);
|
|
22
|
+
/**
|
|
23
|
+
* Test whether a value is a `Signal.ReadonlyArray`.
|
|
24
|
+
*/
|
|
25
|
+
static is(value: unknown): value is Signal.ReadonlyArray<unknown>;
|
|
26
|
+
/**
|
|
27
|
+
* Test whether the array is empty.
|
|
28
|
+
*/
|
|
3
29
|
isEmpty(): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Get the size of the array.
|
|
32
|
+
*/
|
|
4
33
|
size(): number;
|
|
34
|
+
/**
|
|
35
|
+
* Find the index at which the given value first occurs in the array,
|
|
36
|
+
* optionally starting at `fromIndex`. If the value doesn't occur in the
|
|
37
|
+
* array, return `-1`.
|
|
38
|
+
*/
|
|
5
39
|
indexOf(value: A, fromIndex?: number): number;
|
|
40
|
+
/**
|
|
41
|
+
* Find the first index in the array for which the `predicate` function
|
|
42
|
+
* returns true for the value at that index, or `-1` if it never does.
|
|
43
|
+
*/
|
|
6
44
|
findIndex(predicate: (value: A, index: number, obj: Array<A>) => boolean, thisArg?: any): number;
|
|
45
|
+
/**
|
|
46
|
+
* Test whether a value is an array with identical contents to this array.
|
|
47
|
+
*/
|
|
48
|
+
equals(other: unknown): other is Signal.ReadonlyArray<A>;
|
|
49
|
+
/**
|
|
50
|
+
* Copy the contents of this array into a normal {@link Array}.
|
|
51
|
+
*/
|
|
7
52
|
toArray(): Array<A>;
|
|
53
|
+
/**
|
|
54
|
+
* Get the value at the given index, or {@link None} if the index is out of
|
|
55
|
+
* bounds.
|
|
56
|
+
*
|
|
57
|
+
* @throws {@link TypeError} of `index` is not an integer
|
|
58
|
+
*/
|
|
8
59
|
get(index: number): Option<A>;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
static from<T>(iterable: Iterable<T>): SignalArray<T>;
|
|
13
|
-
constructor(iterable: Iterable<A>);
|
|
60
|
+
/**
|
|
61
|
+
* Iterate over the contents of the array.
|
|
62
|
+
*/
|
|
14
63
|
[Symbol.iterator](): IteratorObject<A>;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* An array which behaves like a signal.
|
|
67
|
+
*
|
|
68
|
+
* Any read operation on the array, like {@link Signal.Array.get},
|
|
69
|
+
* {@link Signal.Array.size}, or iteration, acts like a
|
|
70
|
+
* {@link Signal.State.get}, registering the array as a dependency in any
|
|
71
|
+
* computed signals or effects it's used in. Correspondingly, any write
|
|
72
|
+
* operation to the array will cause all of these dependencies to update as
|
|
73
|
+
* with a {@link Signal.State.set}.
|
|
74
|
+
*
|
|
75
|
+
* Note that the API of this array is different from the built-in
|
|
76
|
+
* {@link Array}. This is intentional. Additionally, many operations you'd
|
|
77
|
+
* expect to find on an array, like {@link Array.map} or predicates like
|
|
78
|
+
* {@link Array.every}, are missing from the array itself. It's recommended
|
|
79
|
+
* that you access these through {@link Iterator}s instead.
|
|
80
|
+
*
|
|
81
|
+
* Note also that array access doesn't come with any granularity: if you read
|
|
82
|
+
* only a single index from the array inside a computed signal, *any* change to
|
|
83
|
+
* the array causes the signal to recompute, regardless of whether the value at
|
|
84
|
+
* the index you read changed.
|
|
85
|
+
*/
|
|
86
|
+
export declare class SignalArray<A> extends ReadonlySignalArray<A> {
|
|
87
|
+
/**
|
|
88
|
+
* Construct a new array with the contents of the provided iterable.
|
|
89
|
+
*/
|
|
90
|
+
static from<T>(iterable: Iterable<T>): Signal.Array<T>;
|
|
91
|
+
/**
|
|
92
|
+
* Test whether a value is a `Signal.Array`.
|
|
93
|
+
*/
|
|
94
|
+
static is(value: unknown): value is Signal.Array<unknown>;
|
|
95
|
+
/**
|
|
96
|
+
* Construct a new array, optionally filling it with the contents of the
|
|
97
|
+
* provided iterable.
|
|
98
|
+
*/
|
|
99
|
+
constructor(iterable?: Iterable<A>, options?: Signal.Options<A>);
|
|
100
|
+
/**
|
|
101
|
+
* Return a read-only view of the array.
|
|
102
|
+
*/
|
|
103
|
+
readOnly(): Signal.ReadonlyArray<A>;
|
|
104
|
+
/**
|
|
105
|
+
* Write the given value to the given index of the array, overwriting
|
|
106
|
+
* anything that may have been there before.
|
|
107
|
+
*
|
|
108
|
+
* @throws {@link TypeError} if `index` is negative or not an integer
|
|
109
|
+
*/
|
|
110
|
+
set(index: number, value: A): this;
|
|
111
|
+
/**
|
|
112
|
+
* Append the provided values to the end of the array.
|
|
113
|
+
*
|
|
114
|
+
* @returns the number of values that were inserted.
|
|
115
|
+
*/
|
|
23
116
|
push(...values: Array<A>): number;
|
|
117
|
+
/**
|
|
118
|
+
* Prepend the provided values to the start of the array.
|
|
119
|
+
*
|
|
120
|
+
* @returns the number of values that were inserted.
|
|
121
|
+
*/
|
|
24
122
|
unshift(...values: Array<A>): number;
|
|
123
|
+
/**
|
|
124
|
+
* Remove the item at the front of the array and return it.
|
|
125
|
+
*/
|
|
25
126
|
pop(): Option<A>;
|
|
127
|
+
/**
|
|
128
|
+
* Remove the item at the end of the array and return it.
|
|
129
|
+
*/
|
|
26
130
|
shift(): Option<A>;
|
|
27
|
-
|
|
131
|
+
/** @see {@link Array.splice} */
|
|
132
|
+
splice(start: number, deleteCount?: number, ...values: Array<A>): Array<A>;
|
|
133
|
+
/**
|
|
134
|
+
* Insert the given values starting at the given index, shifting the
|
|
135
|
+
* remainder of the array to higher indices accordingly.
|
|
136
|
+
*
|
|
137
|
+
* @throws {@link TypeError} if `index` is not an integer
|
|
138
|
+
*/
|
|
28
139
|
insert(index: number, ...values: Array<A>): this;
|
|
140
|
+
/**
|
|
141
|
+
* Remove the value at the given index and return it. If there's no value at
|
|
142
|
+
* the given index, return {@link None}.
|
|
143
|
+
*
|
|
144
|
+
* @throws {@link TypeError} if `index` is not an integer
|
|
145
|
+
*/
|
|
29
146
|
removeIndex(index: number): Option<A>;
|
|
147
|
+
/**
|
|
148
|
+
* Remove the first occurrence of the given value from the array, if it
|
|
149
|
+
* exists in the array.
|
|
150
|
+
*/
|
|
30
151
|
remove(value: A): Option<A>;
|
|
152
|
+
/**
|
|
153
|
+
* Remove the first value from the array that matches the given predicate
|
|
154
|
+
* function, if any.
|
|
155
|
+
*/
|
|
31
156
|
removeFn(predicate: (value: A, index: number, obj: Array<A>) => boolean): Option<A>;
|
|
157
|
+
/**
|
|
158
|
+
* Discard all values in the array, leaving an empty array.
|
|
159
|
+
*/
|
|
32
160
|
clear(): this;
|
|
161
|
+
/**
|
|
162
|
+
* Replace the contents of this array with the values contained in
|
|
163
|
+
* `iterable`.
|
|
164
|
+
*/
|
|
165
|
+
replace(iterable: Iterable<A>): this;
|
|
33
166
|
}
|
|
167
|
+
export {};
|
package/dist/array.js
CHANGED
|
@@ -1,126 +1,303 @@
|
|
|
1
1
|
import { None, Some } from "@bodil/opt";
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
2
|
+
import * as Signal from "./signal";
|
|
3
|
+
const instance = Symbol("Signal.Array");
|
|
4
|
+
function arraysEqual(a, b, equals) {
|
|
5
|
+
return a.length === b.length && a.every((value, index) => equals(value, b[index]));
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* A read-only view of a {@link Signal.Array}.
|
|
9
|
+
*
|
|
10
|
+
* This acts just like the {@link Signal.Array} it was created from, mirroring
|
|
11
|
+
* the current contents of the source array, but without the ability to modify
|
|
12
|
+
* it.
|
|
13
|
+
*/
|
|
14
|
+
export class ReadonlySignalArray {
|
|
15
|
+
/** @ignore */
|
|
16
|
+
constructor(instanceProps) {
|
|
17
|
+
this[instance] = instanceProps;
|
|
11
18
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Test whether a value is a `Signal.ReadonlyArray`.
|
|
21
|
+
*/
|
|
22
|
+
static is(value) {
|
|
23
|
+
return value instanceof ReadonlySignalArray;
|
|
15
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* Test whether the array is empty.
|
|
27
|
+
*/
|
|
16
28
|
isEmpty() {
|
|
17
|
-
this
|
|
18
|
-
|
|
29
|
+
const self = this[instance];
|
|
30
|
+
self.signal.get();
|
|
31
|
+
return self.array.length === 0;
|
|
19
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* Get the size of the array.
|
|
35
|
+
*/
|
|
20
36
|
size() {
|
|
21
|
-
this
|
|
22
|
-
|
|
37
|
+
const self = this[instance];
|
|
38
|
+
self.signal.get();
|
|
39
|
+
return self.array.length;
|
|
23
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* Find the index at which the given value first occurs in the array,
|
|
43
|
+
* optionally starting at `fromIndex`. If the value doesn't occur in the
|
|
44
|
+
* array, return `-1`.
|
|
45
|
+
*/
|
|
24
46
|
indexOf(value, fromIndex) {
|
|
25
|
-
this
|
|
26
|
-
|
|
47
|
+
const self = this[instance];
|
|
48
|
+
self.signal.get();
|
|
49
|
+
return self.array.indexOf(value, fromIndex);
|
|
27
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* Find the first index in the array for which the `predicate` function
|
|
53
|
+
* returns true for the value at that index, or `-1` if it never does.
|
|
54
|
+
*/
|
|
28
55
|
findIndex(predicate, thisArg) {
|
|
29
|
-
this
|
|
30
|
-
|
|
56
|
+
const self = this[instance];
|
|
57
|
+
self.signal.get();
|
|
58
|
+
return self.array.findIndex(predicate, thisArg);
|
|
31
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Test whether a value is an array with identical contents to this array.
|
|
62
|
+
*/
|
|
63
|
+
equals(other) {
|
|
64
|
+
if (!ReadonlySignalArray.is(other)) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
const self = this[instance];
|
|
68
|
+
self.signal.get();
|
|
69
|
+
other[instance].signal.get();
|
|
70
|
+
return arraysEqual(self.array, other[instance].array, self.equals ?? Object.is);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Copy the contents of this array into a normal {@link Array}.
|
|
74
|
+
*/
|
|
32
75
|
toArray() {
|
|
33
|
-
this
|
|
34
|
-
|
|
76
|
+
const self = this[instance];
|
|
77
|
+
self.signal.get();
|
|
78
|
+
return self.array.slice();
|
|
35
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* Get the value at the given index, or {@link None} if the index is out of
|
|
82
|
+
* bounds.
|
|
83
|
+
*
|
|
84
|
+
* @throws {@link TypeError} of `index` is not an integer
|
|
85
|
+
*/
|
|
36
86
|
get(index) {
|
|
37
87
|
if (!Number.isInteger(index)) {
|
|
38
88
|
throw new TypeError(`Signal.Array.get: index ${index} is not an integer`);
|
|
39
89
|
}
|
|
40
|
-
this
|
|
41
|
-
|
|
90
|
+
const self = this[instance];
|
|
91
|
+
self.signal.get();
|
|
92
|
+
return Object.hasOwn(this, index) ? Some(self.array[index]) : None;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Iterate over the contents of the array.
|
|
96
|
+
*/
|
|
97
|
+
[Symbol.iterator]() {
|
|
98
|
+
const self = this[instance];
|
|
99
|
+
self.signal.get();
|
|
100
|
+
return Iterator.from(self.array);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* An array which behaves like a signal.
|
|
105
|
+
*
|
|
106
|
+
* Any read operation on the array, like {@link Signal.Array.get},
|
|
107
|
+
* {@link Signal.Array.size}, or iteration, acts like a
|
|
108
|
+
* {@link Signal.State.get}, registering the array as a dependency in any
|
|
109
|
+
* computed signals or effects it's used in. Correspondingly, any write
|
|
110
|
+
* operation to the array will cause all of these dependencies to update as
|
|
111
|
+
* with a {@link Signal.State.set}.
|
|
112
|
+
*
|
|
113
|
+
* Note that the API of this array is different from the built-in
|
|
114
|
+
* {@link Array}. This is intentional. Additionally, many operations you'd
|
|
115
|
+
* expect to find on an array, like {@link Array.map} or predicates like
|
|
116
|
+
* {@link Array.every}, are missing from the array itself. It's recommended
|
|
117
|
+
* that you access these through {@link Iterator}s instead.
|
|
118
|
+
*
|
|
119
|
+
* Note also that array access doesn't come with any granularity: if you read
|
|
120
|
+
* only a single index from the array inside a computed signal, *any* change to
|
|
121
|
+
* the array causes the signal to recompute, regardless of whether the value at
|
|
122
|
+
* the index you read changed.
|
|
123
|
+
*/
|
|
124
|
+
export class SignalArray extends ReadonlySignalArray {
|
|
125
|
+
/**
|
|
126
|
+
* Construct a new array with the contents of the provided iterable.
|
|
127
|
+
*/
|
|
128
|
+
static from(iterable) {
|
|
129
|
+
return new SignalArray(iterable);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Test whether a value is a `Signal.Array`.
|
|
133
|
+
*/
|
|
134
|
+
static is(value) {
|
|
135
|
+
return value instanceof SignalArray;
|
|
42
136
|
}
|
|
137
|
+
/**
|
|
138
|
+
* Construct a new array, optionally filling it with the contents of the
|
|
139
|
+
* provided iterable.
|
|
140
|
+
*/
|
|
141
|
+
constructor(iterable = [], options) {
|
|
142
|
+
super({
|
|
143
|
+
array: Array.from(iterable),
|
|
144
|
+
signal: new Signal.State(null, { equals: () => false }),
|
|
145
|
+
equals: options?.equals,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Return a read-only view of the array.
|
|
150
|
+
*/
|
|
43
151
|
readOnly() {
|
|
44
|
-
return this;
|
|
152
|
+
return new ReadonlySignalArray(this[instance]);
|
|
45
153
|
}
|
|
154
|
+
/**
|
|
155
|
+
* Write the given value to the given index of the array, overwriting
|
|
156
|
+
* anything that may have been there before.
|
|
157
|
+
*
|
|
158
|
+
* @throws {@link TypeError} if `index` is negative or not an integer
|
|
159
|
+
*/
|
|
46
160
|
set(index, value) {
|
|
47
161
|
if (!Number.isInteger(index)) {
|
|
48
162
|
throw new TypeError(`Signal.Array.set: index ${index} is not an integer`);
|
|
49
163
|
}
|
|
50
|
-
if (index
|
|
164
|
+
if (index < 0) {
|
|
51
165
|
throw new RangeError(`Signal.Array.set: index ${index} out of bounds`);
|
|
52
166
|
}
|
|
53
|
-
this
|
|
54
|
-
|
|
167
|
+
const self = this[instance];
|
|
168
|
+
if (!(self.equals ?? Object.is)(self.array[index], value)) {
|
|
169
|
+
self.array[index] = value;
|
|
170
|
+
self.signal.set(null);
|
|
171
|
+
}
|
|
172
|
+
return this;
|
|
55
173
|
}
|
|
174
|
+
/**
|
|
175
|
+
* Append the provided values to the end of the array.
|
|
176
|
+
*
|
|
177
|
+
* @returns the number of values that were inserted.
|
|
178
|
+
*/
|
|
56
179
|
push(...values) {
|
|
57
|
-
const
|
|
58
|
-
|
|
180
|
+
const self = this[instance];
|
|
181
|
+
const result = self.array.push(...values);
|
|
182
|
+
self.signal.set(null);
|
|
59
183
|
return result;
|
|
60
184
|
}
|
|
185
|
+
/**
|
|
186
|
+
* Prepend the provided values to the start of the array.
|
|
187
|
+
*
|
|
188
|
+
* @returns the number of values that were inserted.
|
|
189
|
+
*/
|
|
61
190
|
unshift(...values) {
|
|
62
|
-
const
|
|
63
|
-
|
|
191
|
+
const self = this[instance];
|
|
192
|
+
const result = self.array.unshift(...values);
|
|
193
|
+
self.signal.set(null);
|
|
64
194
|
return result;
|
|
65
195
|
}
|
|
196
|
+
/**
|
|
197
|
+
* Remove the item at the front of the array and return it.
|
|
198
|
+
*/
|
|
66
199
|
pop() {
|
|
67
200
|
if (this.isEmpty()) {
|
|
68
201
|
return None;
|
|
69
202
|
}
|
|
70
|
-
const
|
|
71
|
-
|
|
203
|
+
const self = this[instance];
|
|
204
|
+
const result = self.array.pop();
|
|
205
|
+
self.signal.set(null);
|
|
72
206
|
return Some(result);
|
|
73
207
|
}
|
|
208
|
+
/**
|
|
209
|
+
* Remove the item at the end of the array and return it.
|
|
210
|
+
*/
|
|
74
211
|
shift() {
|
|
75
212
|
if (this.isEmpty()) {
|
|
76
213
|
return None;
|
|
77
214
|
}
|
|
78
|
-
const
|
|
79
|
-
|
|
215
|
+
const self = this[instance];
|
|
216
|
+
const result = self.array.shift();
|
|
217
|
+
self.signal.set(null);
|
|
80
218
|
return Some(result);
|
|
81
219
|
}
|
|
220
|
+
/** @see {@link Array.splice} */
|
|
82
221
|
splice(start, deleteCount, ...values) {
|
|
83
222
|
if (!Number.isInteger(start)) {
|
|
84
|
-
throw new TypeError(`Signal.Array.splice:
|
|
223
|
+
throw new TypeError(`Signal.Array.splice: start ${start} is not an integer`);
|
|
85
224
|
}
|
|
86
|
-
if (
|
|
87
|
-
throw new
|
|
225
|
+
if (deleteCount !== undefined && !Number.isInteger(deleteCount)) {
|
|
226
|
+
throw new TypeError(`Signal.Array.splice: deleteCount ${deleteCount} is not an integer`);
|
|
88
227
|
}
|
|
89
|
-
const
|
|
90
|
-
|
|
228
|
+
const self = this[instance];
|
|
229
|
+
const result = self.array.splice(start, deleteCount, ...values);
|
|
230
|
+
self.signal.set(null);
|
|
91
231
|
return result;
|
|
92
232
|
}
|
|
233
|
+
/**
|
|
234
|
+
* Insert the given values starting at the given index, shifting the
|
|
235
|
+
* remainder of the array to higher indices accordingly.
|
|
236
|
+
*
|
|
237
|
+
* @throws {@link TypeError} if `index` is not an integer
|
|
238
|
+
*/
|
|
93
239
|
insert(index, ...values) {
|
|
94
240
|
if (!Number.isInteger(index)) {
|
|
95
241
|
throw new TypeError(`Signal.Array.insert: index ${index} is not an integer`);
|
|
96
242
|
}
|
|
97
|
-
|
|
98
|
-
throw new RangeError(`Signal.Array.insert: index ${index} out of bounds`);
|
|
99
|
-
}
|
|
100
|
-
this.#array.splice(index, 0, ...values);
|
|
101
|
-
this.#signal.set(null);
|
|
243
|
+
this.splice(index, 0, ...values);
|
|
102
244
|
return this;
|
|
103
245
|
}
|
|
246
|
+
/**
|
|
247
|
+
* Remove the value at the given index and return it. If there's no value at
|
|
248
|
+
* the given index, return {@link None}.
|
|
249
|
+
*
|
|
250
|
+
* @throws {@link TypeError} if `index` is not an integer
|
|
251
|
+
*/
|
|
104
252
|
removeIndex(index) {
|
|
105
253
|
if (!Number.isInteger(index)) {
|
|
106
254
|
throw new TypeError(`Signal.Array.removeIndex: index ${index} is not an integer`);
|
|
107
255
|
}
|
|
108
|
-
if (
|
|
256
|
+
if (!Object.hasOwn(this, index)) {
|
|
109
257
|
return None;
|
|
110
258
|
}
|
|
111
|
-
const
|
|
112
|
-
|
|
259
|
+
const self = this[instance];
|
|
260
|
+
const removed = self.array.splice(index, 1).pop();
|
|
261
|
+
self.signal.set(null);
|
|
113
262
|
return Some(removed);
|
|
114
263
|
}
|
|
264
|
+
/**
|
|
265
|
+
* Remove the first occurrence of the given value from the array, if it
|
|
266
|
+
* exists in the array.
|
|
267
|
+
*/
|
|
115
268
|
remove(value) {
|
|
116
|
-
|
|
269
|
+
const index = this.indexOf(value);
|
|
270
|
+
return index < 0 ? None : this.removeIndex(index);
|
|
117
271
|
}
|
|
272
|
+
/**
|
|
273
|
+
* Remove the first value from the array that matches the given predicate
|
|
274
|
+
* function, if any.
|
|
275
|
+
*/
|
|
118
276
|
removeFn(predicate) {
|
|
119
|
-
|
|
277
|
+
const index = this.findIndex(predicate);
|
|
278
|
+
return index < 0 ? None : this.removeIndex(index);
|
|
120
279
|
}
|
|
280
|
+
/**
|
|
281
|
+
* Discard all values in the array, leaving an empty array.
|
|
282
|
+
*/
|
|
121
283
|
clear() {
|
|
122
|
-
|
|
123
|
-
|
|
284
|
+
const self = this[instance];
|
|
285
|
+
self.array = [];
|
|
286
|
+
self.signal.set(null);
|
|
287
|
+
return this;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Replace the contents of this array with the values contained in
|
|
291
|
+
* `iterable`.
|
|
292
|
+
*/
|
|
293
|
+
replace(iterable) {
|
|
294
|
+
const self = this[instance];
|
|
295
|
+
const oldArray = self.array;
|
|
296
|
+
const newArray = Array.from(iterable);
|
|
297
|
+
if (!arraysEqual(oldArray, newArray, self.equals ?? Object.is)) {
|
|
298
|
+
self.array = newArray;
|
|
299
|
+
self.signal.set(null);
|
|
300
|
+
}
|
|
124
301
|
return this;
|
|
125
302
|
}
|
|
126
303
|
}
|
package/dist/array.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array.js","sourceRoot":"","sources":["../src/array.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"array.js","sourceRoot":"","sources":["../src/array.ts"],"names":[],"mappings":"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"}
|
package/dist/array.test.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { sleep } from "@bodil/core/async";
|
|
1
2
|
import { expect, test } from "vitest";
|
|
2
3
|
import { Signal } from ".";
|
|
3
|
-
test("
|
|
4
|
+
test("Signal.Array", () => {
|
|
4
5
|
const t = Signal.array([1, 2, 3]);
|
|
5
6
|
const length = Signal.computed(() => t.size());
|
|
6
7
|
const three = Signal.computed(() => t.indexOf(3));
|
|
@@ -25,4 +26,36 @@ test("SignalArray", () => {
|
|
|
25
26
|
expect(t.toArray()).toEqual([0, 1, 2, 3, 4]);
|
|
26
27
|
expect(inc.get()).toEqual([1, 2, 3, 4, 5]);
|
|
27
28
|
});
|
|
29
|
+
test("Signal.Array.equals", () => {
|
|
30
|
+
const a = Signal.array([1, 2, 3, 4, 5]);
|
|
31
|
+
const b = Signal.array([1, 2, 3, 4, 5]);
|
|
32
|
+
expect(a.equals(b)).toBeTruthy();
|
|
33
|
+
const c = Signal.array([1, 2, 3, 5, 4]);
|
|
34
|
+
expect(a.equals(c)).toBeFalsy();
|
|
35
|
+
const d = Signal.array([1, 2, 3, 4]);
|
|
36
|
+
expect(a.equals(d)).toBeFalsy();
|
|
37
|
+
const e = [1, 2, 3, 4, 5];
|
|
38
|
+
expect(a.equals(e)).toBeFalsy();
|
|
39
|
+
});
|
|
40
|
+
test("Signal.Array.replace", async () => {
|
|
41
|
+
const a = Signal.array([1, 2, 3, 4, 5]);
|
|
42
|
+
let updates = 0;
|
|
43
|
+
Signal.effect(() => {
|
|
44
|
+
a.size();
|
|
45
|
+
updates++;
|
|
46
|
+
});
|
|
47
|
+
expect(updates).toBe(1);
|
|
48
|
+
a.set(2, 0);
|
|
49
|
+
await sleep(1);
|
|
50
|
+
expect(updates).toBe(2);
|
|
51
|
+
expect(a.toArray()).toEqual([1, 2, 0, 4, 5]);
|
|
52
|
+
a.replace([1, 2, 0, 4, 5]);
|
|
53
|
+
await sleep(1);
|
|
54
|
+
expect(updates).toBe(2);
|
|
55
|
+
expect(a.toArray()).toEqual([1, 2, 0, 4, 5]);
|
|
56
|
+
a.replace([1, 2, 3, 5, 4]);
|
|
57
|
+
await sleep(1);
|
|
58
|
+
expect(a.toArray()).toEqual([1, 2, 3, 5, 4]);
|
|
59
|
+
expect(updates).toBe(3);
|
|
60
|
+
});
|
|
28
61
|
//# sourceMappingURL=array.test.js.map
|
package/dist/array.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array.test.js","sourceRoot":"","sources":["../src/array.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC;AAE3B,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"array.test.js","sourceRoot":"","sources":["../src/array.test.ts"],"names":[],"mappings":"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"}
|