In role Iterator§
See primary documentation in context for method push-exactly
method push-exactly(Iterator:D: $target, int $count --> Mu)
Should produce $count
elements, and for each of them, call $target.push($value)
.
If fewer than $count
elements are available from the iterator, it should return the sentinel value IterationEnd
. Otherwise it should return $count
.
my @array; say (1 .. ∞).iterator.push-exactly(@array, 3); # OUTPUT: «3» say @array; # OUTPUT: «[1 2 3]»
The Iterator role implements this method in terms of pull-one
. In general, this is a method that is not intended to be called directly from the end user who, instead, should implement it in classes that mix the iterator role. For instance, this class implements that role:
class DNA does Iterable does Iterator { has $.chain; has Int $!index = 0; method new ($chain where { $chain ~~ /^^ <[ACGT]>+ $$ / and $chain.chars %% 3 } ) { self.bless( :$chain ); } method iterator( ){ self } method pull-one( --> Mu){ if $!index < $.chain.chars { my $codon = $.chain.comb.rotor(3)[$!index div 3]; $!index += 3; return $codon; } else { return IterationEnd; } } method push-exactly(Iterator:D: $target, int $count --> Mu) { return IterationEnd if $.chain.elems / 3 < $count; for ^($count) { $target.push: $.chain.comb.rotor(3)[ $_ ]; } } }; my $b := DNA.new("AAGCCT"); for $b -> $a, $b, $c { say "Never mind" }; # Does not enter the loop my $þor := DNA.new("CAGCGGAAGCCT"); for $þor -> $first, $second { say "Coupled codons: $first, $second"; # OUTPUT: «Coupled codons: C A G, C G GCoupled codons: A A G, C C T» }
This code, which groups DNA chains in triplets (usually called codons) returns those codons when requested in a loop; if too many are requested, like in the first case for $b -> $a, $b, $c
, it simply does not enter the loop since push-exactly
will return IterationEnd
since it is not able to serve the request for exactly 3 codons. In the second case, however, it requests exactly two codons in each iteration of the loop; push-exactly
is being called with the number of loop variables as the $count
variable.