Fine-grained reactive signals for MoonBit (alien-signals inspired)
moon add mizchi/signalslet count = signal(0)
// Get value (auto-tracked inside effects)
count.get() // => 0
// Set value
count.set(5)
// Update with function
count.update(fn(n) { n + 1 })
// Get without tracking (doesn't create dependency)
count.peek()let a = signal(2)
let b = signal(3)
let sum = memo(fn() { a.get() + b.get() })
sum() // => 5
a.set(10)
sum() // => 13 (recomputed)
sum() // => 13 (cached value)let count = signal(0)
let dispose = render_effect(fn() {
println("count = " + count.get().to_string())
})
count.set(1) // prints "count = 1"
count.set(2) // prints "count = 2"
dispose() // stop the effectlet count = signal(0)
let dispose = effect(fn() {
println("deferred: " + count.get().to_string())
})
// Initial execution happens after current synchronous code completeslet a = signal(0)
let b = signal(0)
let _ = render_effect(fn() {
println("sum = " + (a.get() + b.get()).to_string())
})
batch(fn() {
a.set(1)
b.set(2)
})
// Effect runs only oncelet _ = render_effect(fn() {
let id = set_interval(...)
on_cleanup(fn() {
clear_interval(id)
})
})create_root(fn(dispose) {
let _ = render_effect(fn() { ... })
let _ = render_effect(fn() { ... })
// Stop all effects at once
dispose()
})let _ = render_effect(fn() {
// This signal read won't create a dependency
untracked(fn() {
let _ = some_signal.get()
})
})pub trait Snapshot {
snapshot(Self) -> Self
}pub(all) struct Flags {
value : Int
}pub struct Lens[S, A] {
get : (S) -> A
set : (S, A) -> S
}pub(all) struct Link {
version : Int
dep : ReactiveNode
sub : ReactiveNode
prev_sub : Link?
next_sub : Link?
prev_dep : Link?
next_dep : Link?
}pub(all) enum ReactiveFlags {
None
Mutable
Watching
RecursedCheck
Recursed
Dirty
Pending
}fn[T] batch(f : () -> T) -> Tfn[T] computed(compute : () -> T) -> (() -> T)fn[T] create_root(f : (() -> Unit) -> T) -> Tfn[T] create_root_with_dispose(f : () -> T) -> (T, () -> Unit)fn effect(fn_ : () -> Unit) -> (() -> Unit)fn effect_once(fn_ : () -> Unit) -> Unitfn effect_when(condition : () -> Bool, fn_ : () -> Unit) -> (() -> Unit)fn[T] memo(compute : () -> T) -> (() -> T)fn on_cleanup(cleanup : () -> Unit) -> Unitfn on_mount(fn_ : () -> Unit) -> Unitfn register_disposer(disposer : () -> Unit) -> Unitfn register_owner_cleanup(cleanup : () -> Unit) -> Unitfn render_effect(fn_ : () -> Unit) -> (() -> Unit)fn[T] untracked(f : () -> T) -> TFine-grained reactive signals for MoonBit (alien-signals inspired)