@bodil/signal 0.3.2 → 0.3.4

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.
@@ -0,0 +1,31 @@
1
+ import { type Option } from "@bodil/opt";
2
+ export interface SignalReadonlyArray<A> extends Iterable<A> {
3
+ isEmpty(): boolean;
4
+ size(): number;
5
+ indexOf(value: A, fromIndex?: number): number;
6
+ findIndex(predicate: (value: A, index: number, obj: Array<A>) => boolean, thisArg?: any): number;
7
+ toArray(): Array<A>;
8
+ get(index: number): Option<A>;
9
+ }
10
+ export declare class SignalArray<A> implements Iterable<A>, SignalReadonlyArray<A> {
11
+ #private;
12
+ static from<T>(iterable: Iterable<T>): SignalArray<T>;
13
+ constructor(iterable: Iterable<A>);
14
+ [Symbol.iterator](): IteratorObject<A>;
15
+ isEmpty(): boolean;
16
+ size(): number;
17
+ indexOf(value: A, fromIndex?: number): number;
18
+ findIndex(predicate: (value: A, index: number, obj: Array<A>) => boolean, thisArg?: any): number;
19
+ toArray(): Array<A>;
20
+ get(index: number): Option<A>;
21
+ readOnly(): SignalReadonlyArray<A>;
22
+ set(index: number, value: A): void;
23
+ push(...values: Array<A>): number;
24
+ unshift(...values: Array<A>): number;
25
+ pop(): Option<A>;
26
+ shift(): Option<A>;
27
+ insert(index: number, value: A): this;
28
+ removeIndex(index: number): Option<A>;
29
+ remove(value: A): Option<A>;
30
+ removeFn(predicate: (value: A, index: number, obj: Array<A>) => boolean): Option<A>;
31
+ }
package/dist/array.js ADDED
@@ -0,0 +1,111 @@
1
+ import { None, Some } from "@bodil/opt";
2
+ import { Signal } from ".";
3
+ export class SignalArray {
4
+ #array;
5
+ #signal = Signal(null, { equals: () => false });
6
+ static from(iterable) {
7
+ return new SignalArray(iterable);
8
+ }
9
+ constructor(iterable) {
10
+ this.#array = [...iterable];
11
+ }
12
+ [Symbol.iterator]() {
13
+ this.#signal.get();
14
+ return Iterator.from(this.#array);
15
+ }
16
+ isEmpty() {
17
+ this.#signal.get();
18
+ return this.#array.length === 0;
19
+ }
20
+ size() {
21
+ this.#signal.get();
22
+ return this.#array.length;
23
+ }
24
+ indexOf(value, fromIndex) {
25
+ this.#signal.get();
26
+ return this.#array.indexOf(value, fromIndex);
27
+ }
28
+ findIndex(predicate, thisArg) {
29
+ this.#signal.get();
30
+ return this.#array.findIndex(predicate, thisArg);
31
+ }
32
+ toArray() {
33
+ this.#signal.get();
34
+ return this.#array.slice();
35
+ }
36
+ get(index) {
37
+ if (!Number.isInteger(index)) {
38
+ throw new TypeError(`Signal.Array.get: index ${index} is not an integer`);
39
+ }
40
+ this.#signal.get();
41
+ return index >= 0 && this.#array.length > index ? Some(this.#array[index]) : None;
42
+ }
43
+ readOnly() {
44
+ return this;
45
+ }
46
+ set(index, value) {
47
+ if (!Number.isInteger(index)) {
48
+ throw new TypeError(`Signal.Array.set: index ${index} is not an integer`);
49
+ }
50
+ if (index > this.#array.length || index < 0) {
51
+ throw new RangeError(`Signal.Array.set: index ${index} out of bounds`);
52
+ }
53
+ this.#array[index] = value;
54
+ this.#signal.set(null);
55
+ }
56
+ push(...values) {
57
+ const result = this.#array.push(...values);
58
+ this.#signal.set(null);
59
+ return result;
60
+ }
61
+ unshift(...values) {
62
+ const result = this.#array.unshift(...values);
63
+ this.#signal.set(null);
64
+ return result;
65
+ }
66
+ pop() {
67
+ if (this.isEmpty()) {
68
+ return None;
69
+ }
70
+ const result = this.#array.pop();
71
+ this.#signal.set(null);
72
+ return Some(result);
73
+ }
74
+ shift() {
75
+ if (this.isEmpty()) {
76
+ return None;
77
+ }
78
+ const result = this.#array.shift();
79
+ this.#signal.set(null);
80
+ return Some(result);
81
+ }
82
+ insert(index, value) {
83
+ if (!Number.isInteger(index)) {
84
+ throw new TypeError(`Signal.Array.insert: index ${index} is not an integer`);
85
+ }
86
+ if (index > this.#array.length || index < 0) {
87
+ throw new RangeError(`Signal.Array.insert: index ${index} out of bounds`);
88
+ }
89
+ this.#array.splice(index, 0, value);
90
+ this.#signal.set(null);
91
+ return this;
92
+ }
93
+ removeIndex(index) {
94
+ if (!Number.isInteger(index)) {
95
+ throw new TypeError(`Signal.Array.removeIndex: index ${index} is not an integer`);
96
+ }
97
+ if (index < 0 || index >= this.#array.length) {
98
+ return None;
99
+ }
100
+ const removed = this.#array.splice(index, 1).pop();
101
+ this.#signal.set(null);
102
+ return Some(removed);
103
+ }
104
+ remove(value) {
105
+ return this.removeIndex(this.indexOf(value));
106
+ }
107
+ removeFn(predicate) {
108
+ return this.removeIndex(this.findIndex(predicate));
109
+ }
110
+ }
111
+ //# sourceMappingURL=array.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"array.js","sourceRoot":"","sources":["../src/array.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,28 @@
1
+ import { expect, test } from "vitest";
2
+ import { Signal } from ".";
3
+ test("SignalArray", () => {
4
+ const t = Signal.array([1, 2, 3]);
5
+ const length = Signal.computed(() => t.size());
6
+ const three = Signal.computed(() => t.indexOf(3));
7
+ const inc = Signal.computed(() => Iterator.from(t)
8
+ .map((i) => i + 1)
9
+ .toArray());
10
+ expect(t.size()).toBe(3);
11
+ expect(length.get()).toBe(3);
12
+ expect(three.get()).toBe(2);
13
+ expect(t.toArray()).toEqual([1, 2, 3]);
14
+ expect(inc.get()).toEqual([2, 3, 4]);
15
+ t.push(4);
16
+ expect(t.size()).toBe(4);
17
+ expect(length.get()).toBe(4);
18
+ expect(three.get()).toBe(2);
19
+ expect(t.toArray()).toEqual([1, 2, 3, 4]);
20
+ expect(inc.get()).toEqual([2, 3, 4, 5]);
21
+ t.unshift(0);
22
+ expect(t.size()).toBe(5);
23
+ expect(length.get()).toBe(5);
24
+ expect(three.get()).toBe(3);
25
+ expect(t.toArray()).toEqual([0, 1, 2, 3, 4]);
26
+ expect(inc.get()).toEqual([1, 2, 3, 4, 5]);
27
+ });
28
+ //# sourceMappingURL=array.test.js.map
@@ -0,0 +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,aAAa,EAAE,GAAG,EAAE;IACrB,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAC7B,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;SACjB,OAAO,EAAE,CACjB,CAAC;IAEF,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAErC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACV,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAExC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACb,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC,CAAC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -3,8 +3,9 @@
3
3
  * Proposal](https://github.com/tc39/proposal-signals).
4
4
  * @module
5
5
  */
6
+ import { type Disposifiable } from "@bodil/core/disposable";
6
7
  import { Signal } from "signal-polyfill";
7
- import { type Disposifiable } from "@bodil/disposable";
8
+ import { SignalArray } from "./array";
8
9
  interface ISignal<A> {
9
10
  /**
10
11
  * The current value of the signal.
@@ -104,8 +105,10 @@ declare const SignalGlobal: (<A>(value: A, options?: Signal.Options<A>) => Signa
104
105
  * and the job restarted.
105
106
  */
106
107
  asyncComputed<A>(fn: (abort: AbortSignal) => Promise<A>, options?: Signal.Options<A>): Promise<SignalGlobal.Computed<A>>;
108
+ array<A>(values: Iterable<A>): SignalArray<A>;
107
109
  State: typeof StateSignal;
108
110
  Computed: typeof ComputedSignal;
111
+ Array: typeof SignalArray;
109
112
  subtle: typeof Signal.subtle;
110
113
  };
111
114
  declare namespace SignalGlobal {
@@ -113,5 +116,10 @@ declare namespace SignalGlobal {
113
116
  type State<A> = StateSignal<A>;
114
117
  /** @interface */
115
118
  type Computed<A> = ComputedSignal<A>;
119
+ type Array<A> = SignalArray<A>;
120
+ type Options<A> = Signal.Options<A>;
121
+ namespace subtle {
122
+ type Watcher = Signal.subtle.Watcher;
123
+ }
116
124
  }
117
125
  export { SignalGlobal as Signal };
package/dist/index.js CHANGED
@@ -3,10 +3,11 @@
3
3
  * Proposal](https://github.com/tc39/proposal-signals).
4
4
  * @module
5
5
  */
6
- import { Signal } from "signal-polyfill";
7
- import { toDisposable } from "@bodil/disposable";
8
- import * as Async from "@bodil/core/async";
6
+ import { AbortablePromise } from "@bodil/core/async";
7
+ import { toDisposable } from "@bodil/core/disposable";
9
8
  import { Err, Ok } from "@bodil/opt";
9
+ import { Signal } from "signal-polyfill";
10
+ import { SignalArray } from "./array";
10
11
  /**
11
12
  * A writable state signal.
12
13
  */
@@ -155,7 +156,14 @@ function (value, options) {
155
156
  */
156
157
  asyncComputed(fn, options) {
157
158
  const result = Promise.withResolvers();
158
- const stream = SignalGlobal.computed(() => Async.abortable(fn));
159
+ const stream = SignalGlobal.computed(() => AbortablePromise.run((resolve, reject, abort) => {
160
+ try {
161
+ fn(abort).then(resolve, reject);
162
+ }
163
+ catch (e) {
164
+ reject(e);
165
+ }
166
+ }));
159
167
  const sig = SignalGlobal(Err(new Error()));
160
168
  let job = undefined;
161
169
  let resolved = false;
@@ -170,7 +178,7 @@ function (value, options) {
170
178
  job.abort();
171
179
  }
172
180
  job = stream.get();
173
- job.result.then((next) => {
181
+ job.then((next) => {
174
182
  sig.set(Ok(next));
175
183
  resolve();
176
184
  }, (error) => {
@@ -183,8 +191,12 @@ function (value, options) {
183
191
  });
184
192
  return result.promise;
185
193
  },
194
+ array(values) {
195
+ return SignalArray.from(values);
196
+ },
186
197
  State: StateSignal,
187
198
  Computed: ComputedSignal,
199
+ Array: SignalArray,
188
200
  subtle: Signal.subtle,
189
201
  });
190
202
  export { SignalGlobal as Signal };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -53,16 +53,10 @@ test("asyncComputed", async () => {
53
53
  const s = Signal(1);
54
54
  const c = await Signal.asyncComputed(() => Promise.resolve(s.value + 1));
55
55
  expect(c.value).toEqual(2);
56
- try {
57
- await Signal.asyncComputed(() => {
58
- throw new Error("welp!");
59
- });
60
- throw new Error("computed error failed to throw");
61
- }
62
- catch (error) {
63
- expect(error).toBeInstanceOf(Error);
64
- expect(error.message).toEqual("welp!");
65
- }
56
+ const foo = async () => (await Signal.asyncComputed(() => {
57
+ throw new Error("welp!");
58
+ })).get();
59
+ await expect(foo).rejects.toThrowError(new Error("welp!"));
66
60
  s.value = 2;
67
61
  expect(c.value).toEqual(2);
68
62
  await sleep(1);
@@ -1 +1 @@
1
- {"version":3,"file":"signal.test.js","sourceRoot":"","sources":["../src/signal.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"signal.test.js","sourceRoot":"","sources":["../src/signal.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bodil/signal",
3
- "version": "0.3.2",
3
+ "version": "0.3.4",
4
4
  "description": "Signal implementation built on the TC39 Signals Proposal",
5
5
  "homepage": "https://codeberg.org/bodil/signal",
6
6
  "repository": {
@@ -26,31 +26,55 @@
26
26
  "access": "public"
27
27
  },
28
28
  "dependencies": {
29
- "@bodil/core": "^0.3.0",
30
- "@bodil/disposable": "^0.1.5",
31
- "@bodil/opt": "^0.4.1",
29
+ "@bodil/core": "^0.5.1",
30
+ "@bodil/opt": "^0.4.2",
32
31
  "signal-polyfill": "^0.2.2"
33
32
  },
34
33
  "devDependencies": {
35
- "@bodil/opt-vitest": "^1.1.0",
36
- "@eslint/eslintrc": "^3.3.1",
37
- "@eslint/js": "^9.33.0",
38
- "@typescript-eslint/eslint-plugin": "^8.39.1",
39
- "@typescript-eslint/parser": "^8.39.1",
40
- "eslint": "^9.33.0",
34
+ "@eslint/eslintrc": "^3.3.3",
35
+ "@eslint/js": "^9.39.2",
36
+ "@ianvs/prettier-plugin-sort-imports": "^4.7.0",
37
+ "@typescript-eslint/eslint-plugin": "^8.51.0",
38
+ "@typescript-eslint/parser": "^8.51.0",
39
+ "eslint": "^9.39.2",
41
40
  "eslint-config-prettier": "^10.1.8",
42
- "eslint-plugin-jsdoc": "^54.0.0",
43
- "globals": "^16.3.0",
44
- "typedoc": "^0.28.10",
41
+ "eslint-plugin-jsdoc": "^61.5.0",
42
+ "globals": "^17.0.0",
43
+ "npm-run-all2": "^8.0.4",
44
+ "prettier": "^3.7.4",
45
+ "typedoc": "^0.28.15",
45
46
  "typedoc-plugin-extras": "^4.0.1",
46
- "typedoc-plugin-mdn-links": "^5.0.8",
47
- "typescript": "^5.9.2",
48
- "vitest": "^3.2.4"
47
+ "typedoc-plugin-mdn-links": "^5.0.10",
48
+ "typescript": "^5.9.3",
49
+ "vitest": "^4.0.16"
50
+ },
51
+ "prettier": {
52
+ "editorconfig": true,
53
+ "plugins": [
54
+ "@ianvs/prettier-plugin-sort-imports"
55
+ ],
56
+ "importOrderParserPlugins": [
57
+ "typescript",
58
+ "decorators"
59
+ ],
60
+ "importOrderTypeScriptVersion": "5.0.0",
61
+ "importOrder": [
62
+ "",
63
+ "<BUILTIN_MODULES>",
64
+ "",
65
+ "<THIRD_PARTY_MODULES>",
66
+ "",
67
+ "^[.](?!.*[?]inline$)",
68
+ "",
69
+ "[?]inline$"
70
+ ]
49
71
  },
50
72
  "scripts": {
51
73
  "build": "tsc",
52
74
  "test": "vitest --run",
53
- "lint": "eslint src",
75
+ "check:eslint": "eslint src",
76
+ "check:tsc": "tsc --noEmit",
77
+ "check": "run-p check:tsc check:eslint",
54
78
  "doc": "typedoc",
55
79
  "doc:readthedocs": "typedoc --out $READTHEDOCS_OUTPUT/html",
56
80
  "prepublish": "tsc"
@@ -0,0 +1,34 @@
1
+ import { expect, test } from "vitest";
2
+
3
+ import { Signal } from ".";
4
+
5
+ test("SignalArray", () => {
6
+ const t = Signal.array([1, 2, 3]);
7
+ const length = Signal.computed(() => t.size());
8
+ const three = Signal.computed(() => t.indexOf(3));
9
+ const inc = Signal.computed(() =>
10
+ Iterator.from(t)
11
+ .map((i) => i + 1)
12
+ .toArray(),
13
+ );
14
+
15
+ expect(t.size()).toBe(3);
16
+ expect(length.get()).toBe(3);
17
+ expect(three.get()).toBe(2);
18
+ expect(t.toArray()).toEqual([1, 2, 3]);
19
+ expect(inc.get()).toEqual([2, 3, 4]);
20
+
21
+ t.push(4);
22
+ expect(t.size()).toBe(4);
23
+ expect(length.get()).toBe(4);
24
+ expect(three.get()).toBe(2);
25
+ expect(t.toArray()).toEqual([1, 2, 3, 4]);
26
+ expect(inc.get()).toEqual([2, 3, 4, 5]);
27
+
28
+ t.unshift(0);
29
+ expect(t.size()).toBe(5);
30
+ expect(length.get()).toBe(5);
31
+ expect(three.get()).toBe(3);
32
+ expect(t.toArray()).toEqual([0, 1, 2, 3, 4]);
33
+ expect(inc.get()).toEqual([1, 2, 3, 4, 5]);
34
+ });
package/src/array.ts ADDED
@@ -0,0 +1,146 @@
1
+ import { None, Some, type Option } from "@bodil/opt";
2
+
3
+ import { Signal } from ".";
4
+
5
+ export interface SignalReadonlyArray<A> extends Iterable<A> {
6
+ isEmpty(): boolean;
7
+ size(): number;
8
+ indexOf(value: A, fromIndex?: number): number;
9
+ findIndex(
10
+ predicate: (value: A, index: number, obj: Array<A>) => boolean,
11
+ thisArg?: any,
12
+ ): number;
13
+ toArray(): Array<A>;
14
+ get(index: number): Option<A>;
15
+ }
16
+
17
+ export class SignalArray<A> implements Iterable<A>, SignalReadonlyArray<A> {
18
+ readonly #array: Array<A>;
19
+ readonly #signal = Signal<null>(null, { equals: () => false });
20
+
21
+ static from<T>(iterable: Iterable<T>): SignalArray<T> {
22
+ return new SignalArray(iterable);
23
+ }
24
+
25
+ constructor(iterable: Iterable<A>) {
26
+ this.#array = [...iterable];
27
+ }
28
+
29
+ [Symbol.iterator](): IteratorObject<A> {
30
+ this.#signal.get();
31
+ return Iterator.from(this.#array);
32
+ }
33
+
34
+ isEmpty(): boolean {
35
+ this.#signal.get();
36
+ return this.#array.length === 0;
37
+ }
38
+
39
+ size(): number {
40
+ this.#signal.get();
41
+ return this.#array.length;
42
+ }
43
+
44
+ indexOf(value: A, fromIndex?: number): number {
45
+ this.#signal.get();
46
+ return this.#array.indexOf(value, fromIndex);
47
+ }
48
+
49
+ findIndex(
50
+ predicate: (value: A, index: number, obj: Array<A>) => boolean,
51
+ thisArg?: any,
52
+ ): number {
53
+ this.#signal.get();
54
+ return this.#array.findIndex(predicate, thisArg);
55
+ }
56
+
57
+ toArray(): Array<A> {
58
+ this.#signal.get();
59
+ return this.#array.slice();
60
+ }
61
+
62
+ get(index: number): Option<A> {
63
+ if (!Number.isInteger(index)) {
64
+ throw new TypeError(`Signal.Array.get: index ${index} is not an integer`);
65
+ }
66
+ this.#signal.get();
67
+ return index >= 0 && this.#array.length > index ? Some(this.#array[index]) : None;
68
+ }
69
+
70
+ readOnly(): SignalReadonlyArray<A> {
71
+ return this;
72
+ }
73
+
74
+ set(index: number, value: A) {
75
+ if (!Number.isInteger(index)) {
76
+ throw new TypeError(`Signal.Array.set: index ${index} is not an integer`);
77
+ }
78
+ if (index > this.#array.length || index < 0) {
79
+ throw new RangeError(`Signal.Array.set: index ${index} out of bounds`);
80
+ }
81
+ this.#array[index] = value;
82
+ this.#signal.set(null);
83
+ }
84
+
85
+ push(...values: Array<A>): number {
86
+ const result = this.#array.push(...values);
87
+ this.#signal.set(null);
88
+ return result;
89
+ }
90
+
91
+ unshift(...values: Array<A>): number {
92
+ const result = this.#array.unshift(...values);
93
+ this.#signal.set(null);
94
+ return result;
95
+ }
96
+
97
+ pop(): Option<A> {
98
+ if (this.isEmpty()) {
99
+ return None;
100
+ }
101
+ const result = this.#array.pop()!;
102
+ this.#signal.set(null);
103
+ return Some(result);
104
+ }
105
+
106
+ shift(): Option<A> {
107
+ if (this.isEmpty()) {
108
+ return None;
109
+ }
110
+ const result = this.#array.shift()!;
111
+ this.#signal.set(null);
112
+ return Some(result);
113
+ }
114
+
115
+ insert(index: number, value: A): this {
116
+ if (!Number.isInteger(index)) {
117
+ throw new TypeError(`Signal.Array.insert: index ${index} is not an integer`);
118
+ }
119
+ if (index > this.#array.length || index < 0) {
120
+ throw new RangeError(`Signal.Array.insert: index ${index} out of bounds`);
121
+ }
122
+ this.#array.splice(index, 0, value);
123
+ this.#signal.set(null);
124
+ return this;
125
+ }
126
+
127
+ removeIndex(index: number): Option<A> {
128
+ if (!Number.isInteger(index)) {
129
+ throw new TypeError(`Signal.Array.removeIndex: index ${index} is not an integer`);
130
+ }
131
+ if (index < 0 || index >= this.#array.length) {
132
+ return None;
133
+ }
134
+ const removed = this.#array.splice(index, 1).pop()!;
135
+ this.#signal.set(null);
136
+ return Some(removed);
137
+ }
138
+
139
+ remove(value: A): Option<A> {
140
+ return this.removeIndex(this.indexOf(value));
141
+ }
142
+
143
+ removeFn(predicate: (value: A, index: number, obj: Array<A>) => boolean): Option<A> {
144
+ return this.removeIndex(this.findIndex(predicate as () => boolean));
145
+ }
146
+ }
package/src/index.ts CHANGED
@@ -4,10 +4,12 @@
4
4
  * @module
5
5
  */
6
6
 
7
- import { Signal } from "signal-polyfill";
8
- import { toDisposable, type Disposifiable } from "@bodil/disposable";
9
- import * as Async from "@bodil/core/async";
7
+ import { AbortablePromise } from "@bodil/core/async";
8
+ import { toDisposable, type Disposifiable } from "@bodil/core/disposable";
10
9
  import { Err, Ok, type Result } from "@bodil/opt";
10
+ import { Signal } from "signal-polyfill";
11
+
12
+ import { SignalArray } from "./array";
11
13
 
12
14
  interface ISignal<A> {
13
15
  /**
@@ -137,7 +139,7 @@ const SignalGlobal = Object.assign(
137
139
  */
138
140
  computed<A>(
139
141
  fn: (this: SignalGlobal.Computed<A>) => A,
140
- options?: Signal.Options<A>
142
+ options?: Signal.Options<A>,
141
143
  ): SignalGlobal.Computed<A> {
142
144
  return new SignalGlobal.Computed(fn, options);
143
145
  },
@@ -200,12 +202,20 @@ const SignalGlobal = Object.assign(
200
202
  */
201
203
  asyncComputed<A>(
202
204
  fn: (abort: AbortSignal) => Promise<A>,
203
- options?: Signal.Options<A>
205
+ options?: Signal.Options<A>,
204
206
  ): Promise<SignalGlobal.Computed<A>> {
205
207
  const result = Promise.withResolvers<SignalGlobal.Computed<A>>();
206
- const stream = SignalGlobal.computed(() => Async.abortable(fn));
208
+ const stream = SignalGlobal.computed(() =>
209
+ AbortablePromise.run<A>((resolve, reject, abort) => {
210
+ try {
211
+ fn(abort).then(resolve, reject);
212
+ } catch (e) {
213
+ reject(e as Error);
214
+ }
215
+ }),
216
+ );
207
217
  const sig: SignalGlobal.State<Result<A, Error>> = SignalGlobal(Err(new Error()));
208
- let job: Async.AbortableJob<A> | undefined = undefined;
218
+ let job: AbortablePromise<A> | undefined = undefined;
209
219
  let resolved = false;
210
220
  const resolve = () => {
211
221
  if (!resolved) {
@@ -218,7 +228,7 @@ const SignalGlobal = Object.assign(
218
228
  job.abort();
219
229
  }
220
230
  job = stream.get();
221
- job.result.then(
231
+ job.then(
222
232
  (next) => {
223
233
  sig.set(Ok(next));
224
234
  resolve();
@@ -229,16 +239,21 @@ const SignalGlobal = Object.assign(
229
239
  }
230
240
  sig.set(Err(error));
231
241
  resolve();
232
- }
242
+ },
233
243
  );
234
244
  });
235
245
  return result.promise;
236
246
  },
237
247
 
248
+ array<A>(values: Iterable<A>) {
249
+ return SignalArray.from(values);
250
+ },
251
+
238
252
  State: StateSignal,
239
253
  Computed: ComputedSignal,
254
+ Array: SignalArray,
240
255
  subtle: Signal.subtle,
241
- }
256
+ },
242
257
  );
243
258
 
244
259
  declare namespace SignalGlobal {
@@ -246,6 +261,11 @@ declare namespace SignalGlobal {
246
261
  export type State<A> = StateSignal<A>;
247
262
  /** @interface */
248
263
  export type Computed<A> = ComputedSignal<A>;
264
+ export type Array<A> = SignalArray<A>;
265
+ export type Options<A> = Signal.Options<A>;
266
+ export namespace subtle {
267
+ export type Watcher = Signal.subtle.Watcher;
268
+ }
249
269
  }
250
270
 
251
271
  export { SignalGlobal as Signal };
@@ -1,5 +1,6 @@
1
1
  import { sleep } from "@bodil/core/async";
2
2
  import { expect, test } from "vitest";
3
+
3
4
  import { Signal } from ".";
4
5
 
5
6
  test("Signal", async () => {
@@ -55,15 +56,15 @@ test("asyncComputed", async () => {
55
56
  const s = Signal(1);
56
57
  const c = await Signal.asyncComputed(() => Promise.resolve(s.value + 1));
57
58
  expect(c.value).toEqual(2);
58
- try {
59
- await Signal.asyncComputed(() => {
60
- throw new Error("welp!");
61
- });
62
- throw new Error("computed error failed to throw");
63
- } catch (error) {
64
- expect(error).toBeInstanceOf(Error);
65
- expect((error as Error).message).toEqual("welp!");
66
- }
59
+
60
+ const foo = async () =>
61
+ (
62
+ await Signal.asyncComputed(() => {
63
+ throw new Error("welp!");
64
+ })
65
+ ).get();
66
+ await expect(foo).rejects.toThrowError(new Error("welp!"));
67
+
67
68
  s.value = 2;
68
69
  expect(c.value).toEqual(2);
69
70
  await sleep(1);
@@ -100,4 +101,6 @@ test("Signal types", () => {
100
101
  }
101
102
  foo(s1);
102
103
  foo(s2);
104
+
105
+ type foo = Signal.subtle.Watcher;
103
106
  });