///|
test "creating and accessing refs" {
let r1 = @ref.new(42)
inspect(r1.val, content="42")
}///|
test "updating refs" {
let counter = @ref.new(0)
counter.update(x => x + 1)
inspect(counter.val, content="1")
counter.update(x => x * 2)
inspect(counter.val, content="2")
}///|
test "mapping refs" {
let num = @ref.new(10)
let doubled = num.map(x => x * 2)
inspect(doubled.val, content="20")
let squared = num.map(x => x * x)
inspect(squared.val, content="100")
}///|
test "swapping refs" {
let r1 = @ref.new("first")
let r2 = @ref.new("second")
@ref.swap(r1, r2)
inspect(r1.val, content="second")
inspect(r2.val, content="first")
}///|
test "protected updates" {
let state = @ref.new(100)
let mut middle = 0
let result = state.protect(50, () => {
middle = state.val
42
})
inspect(middle, content="50")
inspect(result, content="42")
inspect(state.val, content="100")
}pub(all) struct Ref[T] {
val : T
}test {
let x = @ref.Ref(42)
@test.assert_eq(x.val, 42)
x.val = 100
@test.assert_eq(x.val, 100)
}test {
@test.assert_eq(@ref.new(1).map(a => a + 1).val, 2)
}test {
let x = @ref.new(1)
x.protect(2, () => x.val = 3)
@test.assert_eq(x.val, 1)
}test {
let x = @ref.new(1)
let y = @ref.new(2)
@ref.swap(x, y)
@test.assert_eq(x.val, 2)
@test.assert_eq(y.val, 1)
}Install
Installed by default