#!/usr/bin/perl use strict; use warnings; use Data::Dumper; use Coro; use Test::More tests => 2; # copied from Coro::Generator our @yieldstack; our $retval; our @params; sub generator { my $code = shift; my $prev = new Coro::State; my $coro = Coro::State->new(sub { yield(); { $code->(@params) && redo; } }); push @yieldstack, [$coro, $prev]; $prev->transfer($coro); return sub { @params = @_; push @yieldstack, [$coro, $prev, @_]; $prev->transfer($coro); return $retval; }; } sub yield { $retval = shift; my ($coro, $prev) = @{pop @yieldstack}; $coro->transfer($prev); # return @params; return $retval; # pass through } sub avoid_restart (&) { my $subref = shift; return sub { $subref->(); yield undef while 1; }; } my $generator = generator avoid_restart { yield 1; yield 2; }; my @result; for (1..10) { push @result, $generator->(); } is_deeply \@result, [1,2] or diag Dumper(\@result); my $g2 = generator sub { my $x = yield 1; warn "[$x]"; my $y = yield 2; warn "[$y]"; my $z = yield 3; warn "[$x]"; }; for (1..3) { my $result = $g2->(); warn "GOTS $result"; }