From 188b7b1d90057b2c655430d45ce774709ee939e7 Mon Sep 17 00:00:00 2001 From: Elizabeth Mattijsen Date: Sat, 8 Apr 2017 13:55:13 +0200 Subject: [PATCH] Implement .tail(*-N) for all but first N elements --- src/core/Any-iterable-methods.pm | 10 +++++++++- src/core/Array.pm | 11 ++++++++--- src/core/List.pm | 11 ++++++++--- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/core/Any-iterable-methods.pm b/src/core/Any-iterable-methods.pm index c25e4769b48..c787fdb176f 100644 --- a/src/core/Any-iterable-methods.pm +++ b/src/core/Any-iterable-methods.pm @@ -1878,7 +1878,15 @@ Did you mean to add a stub (\{...\}) or did you mean to .classify?" } multi method tail(Any:D: $n) { Seq.new( - Rakudo::Iterator.LastNValues(self.iterator,$n,'tail') + nqp::if( + nqp::istype($n,Callable) + && nqp::isgt_i((my $skip := -($n(0).Int)),0), + nqp::stmts( + (my $iterator := self.iterator).skip-at-least($skip), + $iterator + ), + Rakudo::Iterator.LastNValues(self.iterator,$n,'tail') + ) ) } diff --git a/src/core/Array.pm b/src/core/Array.pm index e4945e70f04..72197591b2a 100644 --- a/src/core/Array.pm +++ b/src/core/Array.pm @@ -1050,9 +1050,14 @@ my class Array { # declared in BOOTSTRAP && nqp::elems($reified), nqp::stmts( (my $iterator := Rakudo::Iterator.ReifiedArray(self)), - nqp::unless( - nqp::istype($n,Whatever) || $n == Inf, - $iterator.skip-at-least(nqp::elems($reified) - $n) + nqp::if( + nqp::istype($n,Callable) + && nqp::isgt_i((my $skip := -($n(0).Int)),0), + $iterator.skip-at-least($skip), + nqp::unless( + nqp::istype($n,Whatever) || $n == Inf, + $iterator.skip-at-least(nqp::elems($reified) - $n) + ) ), $iterator ), diff --git a/src/core/List.pm b/src/core/List.pm index 34366dc48f4..e40a9232cad 100644 --- a/src/core/List.pm +++ b/src/core/List.pm @@ -1285,9 +1285,14 @@ my class List does Iterable does Positional { # declared in BOOTSTRAP $!reified.DEFINITE && nqp::elems($!reified), nqp::stmts( (my $iterator := Rakudo::Iterator.ReifiedList(self)), - nqp::unless( - nqp::istype($n,Whatever) || $n == Inf, - $iterator.skip-at-least(nqp::elems($!reified) - $n) + nqp::if( + nqp::istype($n,Callable) + && nqp::isgt_i((my $skip := -($n(0).Int)),0), + $iterator.skip-at-least($skip), + nqp::unless( + nqp::istype($n,Whatever) || $n == Inf, + $iterator.skip-at-least(nqp::elems($!reified) - $n) + ) ), $iterator ),