;; -*- Mode: Irken -*-
(include "lib/basis.scm")
(define run-queue (queue/make))
(define (enqueue k)
(queue/add run-queue k))
(define (dispatch)
(match (queue/pop run-queue) with
(maybe:yes k) -> (k #u)
(maybe:no) -> #u))
(define (fork f)
(call/cc
(lambda (k)
(enqueue k)
(f)
(dispatch)
)))
(define (yield)
(call/cc
(lambda (k)
(enqueue k)
(dispatch)
)))
(define (thread n)
(for-range
i 10
(print-string (format "thread# " (int n) ":" (int i) "\n"))
(yield)
))
(print-string "first fork\n")
(fork (lambda () (thread 0)))
(print-string "second fork\n")
(fork (lambda () (thread 1)))
(thread 2)
(print-string (format "queue length = " (int run-queue.length) "\n"))