diff --git a/src/core/List.pm b/src/core/List.pm index 27289aa5544..9bab4089d80 100644 --- a/src/core/List.pm +++ b/src/core/List.pm @@ -819,29 +819,7 @@ my class List does Iterable does Positional { # declared in BOOTSTRAP Seq.new(Rakudo::Internals.IterateKeyValueFromIterator(self.iterator)) } multi method pairs(List:D:) { - Seq.new(class :: does Iterator { - has Mu $!iter; - has int $!key; - - method !SET-SELF(\iter) { $!iter := iter; $!key = -1; self } - method new(\iter) { nqp::create(self)!SET-SELF(iter) } - - method pull-one() is raw { - nqp::if( - nqp::eqaddr((my $pulled := $!iter.pull-one),IterationEnd), - IterationEnd, - Pair.new(($!key = nqp::add_i($!key,1)),$pulled) - ) - } - method push-all($target --> IterationEnd) { - my $pulled; - my int $key = -1; - nqp::until( - nqp::eqaddr(($pulled := $!iter.pull-one),IterationEnd), - $target.push(Pair.new(($key = nqp::add_i($key,1)),$pulled)) - ) - } - }.new(self.iterator)) + Seq.new(Rakudo::Internals.IteratePairFromIterator(self.iterator)) } multi method antipairs(List:D:) { my $laze = self.is-lazy; diff --git a/src/core/Rakudo/Internals.pm b/src/core/Rakudo/Internals.pm index 9a9ae1036f2..f1df51f2aa1 100644 --- a/src/core/Rakudo/Internals.pm +++ b/src/core/Rakudo/Internals.pm @@ -659,6 +659,33 @@ my class Rakudo::Internals { }.new(iterator) } + # iterate 1dimensional Pair from iterator + method IteratePairFromIterator(\iterator) { + class :: does Iterator { + has Mu $!iter; + has int $!key; + + method !SET-SELF(\iter) { $!iter := iter; $!key = -1; self } + method new(\iter) { nqp::create(self)!SET-SELF(iter) } + + method pull-one() is raw { + nqp::if( + nqp::eqaddr((my $pulled := $!iter.pull-one),IterationEnd), + IterationEnd, + Pair.new(($!key = nqp::add_i($!key,1)),$pulled) + ) + } + method push-all($target --> IterationEnd) { + my $pulled; + my int $key = -1; + nqp::until( + nqp::eqaddr(($pulled := $!iter.pull-one),IterationEnd), + $target.push(Pair.new(($key = nqp::add_i($key,1)),$pulled)) + ) + } + }.new(iterator) + } + method EmptyIterator() { BEGIN class :: does Iterator { method new() { nqp::create(self) }