const context: Function[] = []
const getCurrentObserver = () => context[context.length - 1]
export function createSignal<T = any>(value: T) {
const subscribers = new Set<Function>()
const read = () => {
const current = getCurrentObserver()
if (current) subscribers.add(current)
return value
}
const write = (nextValue: T) => {
value = nextValue
for (const sub of subscribers) sub()
}
return [read, write] as const
}
export function createEffect(fn: Function) {
const execute = () => {
context.push(execute)
try {
fn()
} finally {
context.pop()
}
}
execute()
}