MoonBit API

Signals

Signals は Luna のリアクティビティシステムの基盤です。

signal

リアクティブな値を作成します。

let count = @signal.signal(0)

// 読み取り
println(count.get().to_string())  // 0

// 書き込み
count.set(1)

// 更新
count.update(fn(n) { n + 1 })

effect

Signal の変更に反応する副作用を作成します。

let count = @signal.signal(0)

@signal.effect(fn() {
  println("Count changed: " + count.get().to_string())
})

count.set(1)  // 出力: Count changed: 1

memo

派生値を計算します。依存する Signal が変更されたときのみ再計算されます。

let count = @signal.signal(2)
let doubled = @signal.memo(fn() { count.get() * 2 })

println(doubled().to_string())  // 4
count.set(3)
println(doubled().to_string())  // 6

batch

複数の更新をバッチ処理します。

let a = @signal.signal(0)
let b = @signal.signal(0)

@signal.batch(fn() {
  a.set(1)
  b.set(2)
})
// Effect は1回だけ実行される

untrack

Signal の読み取りを追跡から除外します。

let a = @signal.signal(0)
let b = @signal.signal(0)

@signal.effect(fn() {
  let val_a = a.get()
  let val_b = @signal.untrack(fn() { b.get() })
  println("\{val_a}, \{val_b}")
})
// a が変更されたときのみ実行される