(import urn/control/prompt ())

(defun run-tasks (&tasks) ; 1
  (loop [(queue tasks)] ; 2
    [(empty? queue)]    ; 2
    (call/p 'task (car queue)
      (lambda (k)
        (when (alive? k)
          (push-cdr! queue k)))) ; 2
    (recur (cdr queue))))

(defun yield ()
  (abort-to-prompt 'task))

(run-tasks
  (lambda ()
    (map (lambda (x)
           (print! $"loop 1: ~{x}")
           (yield))
         (range :from 1 :to 5)))
  (lambda ()
    (map (lambda (x)
           (print! $"loop 2: ~{x}")
           (yield))
         (range :from 1 :to 5))))

