From 9ccfc90edbb1b72c00a528c50785257573e43630 Mon Sep 17 00:00:00 2001 From: Elizabeth Mattijsen Date: Sat, 4 Jul 2020 14:52:28 +0200 Subject: [PATCH] Add support for Supply.tail(*) and .tail(Inf) These appear to have been forgotten before. --- src/core.c/Supply-coercers.pm6 | 61 ++++++++++++++++------------------ 1 file changed, 28 insertions(+), 33 deletions(-) diff --git a/src/core.c/Supply-coercers.pm6 b/src/core.c/Supply-coercers.pm6 index 0dd69362f37..3f23b0328d0 100644 --- a/src/core.c/Supply-coercers.pm6 +++ b/src/core.c/Supply-coercers.pm6 @@ -593,39 +593,34 @@ } } } - multi method tail(Supply:D: Int(Cool) $number) { - if $number > 1 { - my int $size = $number; - supply { - my $lastn := nqp::list; - my int $index = 0; - nqp::setelems($lastn,$number); # presize list - nqp::setelems($lastn,0); - - whenever self -> \val { - nqp::bindpos($lastn,$index,val); - $index = ($index + 1) % $size; - LAST { - my int $todo = nqp::elems($lastn); - $index = 0 # start from beginning - if $todo < $size; # if not a full set - while $todo { - emit nqp::atpos($lastn,$index); - $index = ($index + 1) % $size; - $todo = $todo - 1; - } - } - } - } - } - elsif $number == 1 { - self.tail - } - else { # number <= 0, needed to keep tap open - supply { - whenever self -> \val { } - } - } + multi method tail(Supply:D: \limit) { + nqp::istype(limit,Whatever) || limit == Inf + ?? self + !! limit <= 0 + ?? supply { whenever self -> \val { } } + !! (my int $size = limit.Int) == 1 + ?? self.tail + !! supply { + my $lastn := nqp::list; + my int $index = 0; + nqp::setelems($lastn,$size); # presize list + nqp::setelems($lastn,0); + + whenever self -> \val { + nqp::bindpos($lastn,$index,val); + $index = ($index + 1) % $size; + LAST { + my int $todo = nqp::elems($lastn); + $index = 0 # start from beginning + if $todo < $size; # if not a full set + while $todo { + emit nqp::atpos($lastn,$index); + $index = ($index + 1) % $size; + $todo = $todo - 1; + } + } + } + } } method skip(Supply:D: Int(Cool) $number = 1) {