task = {} tasks = {} task.add = (co) -> tasks[co] = true task.pump = () -> for task, _ in pairs tasks if coroutine.status(task) ~= "dead" succ, err = coroutine.resume(task) if not succ error(debug.traceback(task, err)) else tasks[task] = nil task.await = (co) -> if tasks[co] coroutine.yield! task.node = am.group! task.node\action(() -> task.pump! ) task