34 lines
700 B
TypeScript
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;
|
|
}
|