avoid GC in signal/effect

This commit is contained in:
Schluffe
2026-08-25 16:21:48 +02:00
parent 05ec3f468d
commit 2bcd072667
8 changed files with 92 additions and 76 deletions
+4 -1
View File
@@ -13,7 +13,10 @@ test("createSignal", () => {
test("createEffect", () => {
const [test, setTest] = createSignal("foo");
const callback = vi.fn(test);
const callback = vi.fn(() => {
test();
test();
});
createEffect(callback);
expect(callback).toHaveBeenCalledTimes(1);
+9 -4
View File
@@ -4,17 +4,22 @@ let current: Current = null;
export function createSignal<T>(value: T): [() => T, (value: T) => void] {
let innerValue = value;
const observers = new Set<() => void>();
const observers: Array<Current> = [];
const indices = new Map<Current, number>();
const getter = () => {
current !== null && observers.add(current);
if (current !== null && !indices.has(current)) {
observers.push(current);
indices.set(current, observers.length);
}
return innerValue;
};
const setter = (value: T) => {
innerValue = value;
for (const observer of observers) {
observer();
for (let i = 0; i < observers.length; i++) {
observers[i]!();
}
};