// retoor <retoor@molodetz.nl>
import "scheduler" for Scheduler
import "timer" for Timer
class TaskQueue {
construct new() {
_tasks = []
_running = true
}
add(name, duration) {
System.print("[Queue] Adding task: \%(name) (\%(duration)ms)")
_tasks.add({
System.print("[Worker] Starting \%(name)...")
Timer.sleep(duration)
System.print("[Worker] Finished \%(name).")
})
}
start() {
System.print("[Queue] Starting task runner...")
Fiber.new {
while (_running) {
if (!_tasks.isEmpty) {
var task = _tasks.removeAt(0)
task.call()
}
Timer.sleep(100) // Yield to other fibers
}
}.call()
}
stop() { _running = false }
}
var queue = TaskQueue.new()
// Start the worker in the background
queue.start()
// Add some tasks from the main thread
queue.add("Task A", 1500)
queue.add("Task B", 500)
queue.add("Task C", 1000)
System.print("[Main] All tasks queued. Main fiber is free.")
// Keep the main loop alive for a bit to see the output
Timer.sleep(4000)
queue.stop()
System.print("[Main] Shutdown.")