Files
nage/engine/lib/Signal.ts
T
2026-08-25 16:21:48 +02:00

34 lines
700 B
TypeScript

type Current = null | (() => void);
let current: Current = null;
export function createSignal<T>(value: T): [() => T, (value: T) => void] {
let innerValue = value;
const observers: Array<Current> = [];
const indices = new Map<Current, number>();
const getter = () => {
if (current !== null && !indices.has(current)) {
observers.push(current);
indices.set(current, observers.length);
}
return innerValue;
};
const setter = (value: T) => {
innerValue = value;
for (let i = 0; i < observers.length; i++) {
observers[i]!();
}
};
return [getter, setter];
}
export function createEffect(callback: () => void): void {
current = callback;
callback();
current = null;
}