#!/usr/bin/perl use strict; use warnings; use Data::Dumper; use Coro::State; sub yield { my $retval = $Monad::retval = shift; $Monad::cDo->transfer($Monad::cMain); return $retval; } sub Do (&) { my $Do = shift; local $Monad::retval; local $Monad::cMain = Coro::State->new; local $Monad::cDo = Coro::State->new(sub { $Do->(); yield undef; }); $Monad::cMain->transfer($Monad::cDo); my $first = $Monad::retval; { $Monad::cMain->transfer($Monad::cDo); last unless my $retval = $Monad::retval; print "Gots $retval ($first)"; redo; } }; Do { my $x = yield 3; my $y = yield 4; my $z = yield 5; print "All $x,$y,$z\n"; };