Adapton-style demand-driven incremental computation in MoonBit
moon add bobzhang/incrpython3 examples/dispatch/build.py
# Open _build/dispatch/index.html in your browser.///|
test "readme incremental total" {
let engine = @incr.Engine()
let price = engine.cell(20)
let quantity = engine.cell(3)
let total = engine.thunk(() => price.force() * quantity.force())
assert_eq(total.force(), 60)
assert_eq(total.force(), 60)
assert_eq(engine.stats().evaluations, 1)
quantity.set(4)
assert_eq(engine.stats().evaluations, 1)
assert_eq(total.force(), 80)
assert_eq(engine.stats().evaluations, 2)
}///|
test "readme memoization" {
let engine = @incr.Engine()
let fib = @incr.Memo::recursive(engine, (memo, n : Int32) => {
if n < 2 {
n
} else {
memo.call(n - 1) + memo.call(n - 2)
}
})
assert_eq(fib.call(10), 55)
assert_eq(engine.stats().evaluations, 11)
let double = @incr.Memo(engine, x => x * 2)
let name = @incr.name_of_string("answer")
let answer = double.named(name, 21)
assert_eq(answer.force(), 42)
assert_true(answer == double.named(name, 30))
assert_eq(answer.force(), 60)
}///|
test "readme projection" {
let engine = @incr.Engine()
let record = engine.cell(("Ada", 20))
let greeting = engine.thunk(() => "Hello, " + record.force_map(x => x.0))
assert_eq(greeting.force(), "Hello, Ada")
record.set(("Ada", 21))
assert_eq(greeting.force(), "Hello, Ada")
assert_eq(engine.stats().evaluations, 1)
}moon check --target all --warn-list +unnecessary_annotation
moon test
moon test --target js
moon test --target native
moon run cmd/demo
moon fmt
moon infopub struct Art[T] {
// private fields
}pub struct Cells[T] {
// private fields
}pub struct Engine {
// private fields
}pub struct Memo[A, T] {
// private fields
}Install
Download zipAdapton-style demand-driven incremental computation in MoonBit