///|
fn main {
let vm = @moonwren.Vm::new(
@moonwren.VmLimits::standard(500000),
fn(_, name) { @moonwren.ModuleLoadFailed("missing module \{name}") },
[],
[],
)
let source =
#|import "task" for Task
#|import "timer" for Timer
#|var worker = Fn.new {
#| var left = Task.run(Fn.new {
#| Timer.sleep(20)
#| return 20
#| })
#| var right = Task.run(Fn.new {
#| Timer.sleep(5)
#| return 22
#| })
#| return Task.all([left, right]).reduce { |sum, value| sum + value }
#|}
match vm.interpret("main", source) {
@moonwren.ProgramFailed(issues, _) => {
println(issues[0].render(source))
return
}
_ => ()
}
let worker = match vm.capture("main", "worker") {
@moonwren.VmHandleCreated(handle) => handle
@moonwren.VmHandleFailed(issue) => {
println(issue.message)
return
}
}
let scheduler = vm.new_scheduler(16)
ignore(scheduler.spawn(worker))
ignore(scheduler.poll())
ignore(scheduler.advance(5.0))
ignore(scheduler.poll())
ignore(scheduler.advance(15.0))
ignore(scheduler.poll())
match scheduler.poll() {
@moonwren.VmSchedulerTaskCompleted(0, value, _) =>
println("joined result: \{value.to_text()}")
@moonwren.VmSchedulerTaskFailed(_, issues, _) => println(issues[0].message)
_ => println("root task is still waiting")
}
scheduler.close()
ignore(vm.release(worker))
vm.close()
}