# New Ticket Created by Jonathan Stowe
# Please include the string: [perl #127428]
# in the subject line of all future correspondence about this issue.
# <URL: https://rt.perl.org/Ticket/Display.html?id=127428 >
Hi,
I was investigating some problem I was having with my own code and came upon
this.
It appears that "done" in a whenever block in a react does not actually exit
the react.
react { whenever Supply.interval(1) -> $v { say "done"; done(); }; }
will print "done" but not exit, although it would appear that the processing of
other whenever blocks is blocked.
If however the "done" is protect by a comparison against the value passed to
the block then it does work as expected:
react { whenever Supply.interval(2) -> $v { if $v == 2 {say "done"; done();
} }; whenever Supply.interval(1) { say "tick"}}
tick
tick
tick
tick
done
And then exits the react. However if the block is protected by some other
condition (that doesn't check the value supplied to the block,) then it doesn't
exit the react:
react { whenever Supply.interval(3) -> $v { if 1 == 1 {say "done"; done();
} }; whenever Supply.interval(1) { say "tick"}}
It appears to execute the block immediately, terminate the other whenever and
not exit the loop.
Interestingly also if
react { whenever Supply.interval(3) -> $v { if Bool.pick {say "done";
done(); } }; whenever Supply.interval(1) { say "tick"}}
picks True first it doesn't exit but does it at least one "tick" block is
executed. So it would appear (can you tell that I am finding more weirdness the
harder I look :) that if it calls "done" on the time of its first execution
then the done doesn't work correctly. This would militate against using an
externally controlled Promise to execute a done for example.
I'm guessing that this is tricky to test but something like:
my $p = Promise.new;
my $q = start {
react { whenever $p { say " done"; done; } };
True
};
$p.keep;
sleep 1;
say $q.status;
May help somewhat.
It can all be worked around but I am sure it's not the intended behaviour.
This is with the
This is Rakudo version 2015.12-225-g7801920 built on MoarVM version
2015.12-29-g8079ca5
implementing Perl 6.c.