Skip to content

Commit 48e7ded

Browse files
author
Taras Mankovski
committed
Delegate boolean and set signals to createValueSignal
Boolean becomes a one-liner since it's just a ValueSignal<boolean>. Set uses createValueSignal with immutable's `is` for equality, removing manual ref/signal management while keeping all extra methods.
1 parent 27fa9ea commit 48e7ded

2 files changed

Lines changed: 34 additions & 75 deletions

File tree

signals/boolean.ts

Lines changed: 3 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,10 @@
1-
import { createSignal, type Operation, resource } from "effection";
1+
import type { Operation } from "effection";
22

3+
import { createValueSignal } from "./value.ts";
34
import type { ValueSignal } from "./types.ts";
45

56
export interface BooleanSignal extends ValueSignal<boolean> {}
67

78
export function createBooleanSignal(initial = false): Operation<BooleanSignal> {
8-
return resource(function* (provide) {
9-
const signal = createSignal<boolean, void>();
10-
11-
const ref = { current: initial };
12-
13-
function set(value: boolean) {
14-
if (value !== ref.current) {
15-
ref.current = value;
16-
17-
signal.send(ref.current);
18-
}
19-
20-
return ref.current;
21-
}
22-
23-
try {
24-
yield* provide({
25-
[Symbol.iterator]: signal[Symbol.iterator],
26-
set,
27-
update(updater) {
28-
return set(updater(ref.current));
29-
},
30-
valueOf() {
31-
return ref.current;
32-
},
33-
});
34-
} finally {
35-
signal.close();
36-
}
37-
});
9+
return createValueSignal(initial);
3810
}

signals/set.ts

Lines changed: 31 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import { createSignal, type Operation, resource } from "effection";
2-
import type { ValueSignal } from "./types.ts";
1+
import { type Operation, resource } from "effection";
32
import { is, Set } from "immutable";
3+
import type { ValueSignal } from "./types.ts";
4+
import { createValueSignal } from "./value.ts";
45

56
/**
67
* A signal that represents a Set.
@@ -41,50 +42,36 @@ export function createSetSignal<T>(
4142
initial: Array<T> = [],
4243
): Operation<SetSignal<T>> {
4344
return resource(function* (provide) {
44-
const signal = createSignal<Set<T>, void>();
45+
const signal = yield* createValueSignal(Set.of<T>(...initial), {
46+
equals: is,
47+
});
4548

46-
const ref = { current: Set.of<T>(...initial) };
47-
48-
function set(value: Iterable<T>) {
49-
if (is(ref.current, value)) {
50-
return ref.current;
51-
}
52-
ref.current = Set.of<T>(...value);
53-
signal.send(ref.current);
54-
return ref.current;
49+
function set(value: Iterable<T>): Set<T> {
50+
return signal.set(Set.of<T>(...value));
5551
}
5652

57-
try {
58-
yield* provide({
59-
[Symbol.iterator]: signal[Symbol.iterator],
60-
set,
61-
update(updater) {
62-
return set(updater(ref.current));
63-
},
64-
add(item) {
65-
ref.current = ref.current.add(item);
66-
signal.send(ref.current);
67-
return ref.current;
68-
},
69-
difference(items) {
70-
ref.current = ref.current.subtract(items);
71-
signal.send(ref.current);
72-
return ref.current;
73-
},
74-
delete(item) {
75-
if (ref.current.has(item)) {
76-
ref.current = ref.current.delete(item);
77-
signal.send(ref.current);
78-
return true;
79-
}
80-
return false;
81-
},
82-
valueOf() {
83-
return ref.current.toSet();
84-
},
85-
});
86-
} finally {
87-
signal.close();
88-
}
53+
yield* provide({
54+
[Symbol.iterator]: signal[Symbol.iterator],
55+
set,
56+
update(updater) {
57+
return set(updater(signal.valueOf().toSet()));
58+
},
59+
add(item) {
60+
return signal.set(signal.valueOf().add(item));
61+
},
62+
difference(items) {
63+
return signal.set(signal.valueOf().subtract(items));
64+
},
65+
delete(item) {
66+
if (signal.valueOf().has(item)) {
67+
signal.set(signal.valueOf().delete(item));
68+
return true;
69+
}
70+
return false;
71+
},
72+
valueOf() {
73+
return signal.valueOf().toSet();
74+
},
75+
});
8976
});
9077
}

0 commit comments

Comments
 (0)