
(define (resume-maker update-proc!)
  (lambda (next-coroutine value)
	(let ([receiver (lambda (continuation)
					  (update-proc! continuation)
					  (next-coroutine value))])
	  (call/cc receiver))))

(define (coroutine-maker proc)
  (let ([saved-continuation '()])
	(let ([update-continuation! (lambda (v)
								  ;(println "updating")
								  (set! saved-continuation v))])
	  (let ([resumer (resume-maker update-continuation!)]
			[first-time #t])
		(lambda (value)
		  (if first-time
			  (begin
				(set! first-time #f)
				(proc resumer value))
			  (saved-continuation value)))))))

(define ping
  (let ([ping-procedure (lambda (resume value)
						  (println "Pinging 1")
						  (resume pong value)
						  (println "Pinging 2")
						  (resume pong value)
						  (println "Pinging 3")
						  (resume pong value))])
	(coroutine-maker ping-procedure)))

(define pong
  (let ([pong-procedure (lambda (resume value)
						  (println "Ponging 1")
						  (resume ping value)
						  (println "Ponging 2")
						  (resume ping value)
						  (println "Ponging 3")
						  (resume ping value))])
	(coroutine-maker pong-procedure)))

 (ping 1)
