let output = \ n -> begin setZ (getZ ++ " " ++ n) end in let consumer = \ gen -> begin setX (pair (fst getX) gen); while fst getX < 10 do begin output (fst getX); let rest = callcc (snd getX) in setX (pair (fst getX + 1) rest) end end in let generator = \ con -> begin setY (pair (fst getY) con); while fst getY > 0 do begin output (fst getY); let rest = callcc (snd getY) in setY (pair (fst getY - 1) rest) end end in begin setX (pair 0 generator); setY (pair 10 consumer); consumer generator; getZ end