Red.git | lib/Red/ResultSeq/ | Iterator.rakumod
use Red::DB;
use Red::AST;
use Red::Driver;
use Red::Utils;
unit class Red::ResultSeq::Iterator does Iterator;
has Mu:U $.of is required;
has Red::AST $.ast is required;
has &.post;
has $!st-handler;
has Red::Driver $.driver = get-RED-DB;
submethod TWEAK(|) {
my $ast = $!driver.optimize: $!ast;
my @st-handler = $!driver.prepare: $ast;
@st-handler>>.execute unless $*RED-DRY-RUN;
$!st-handler = @st-handler.tail;
$!of.^emit: $ast;
CATCH {
default {
$!of.^emit: $ast, :error($_);
proceed
}
}
}
#method is-lazy { True }
method pull-one {
if $*RED-DRY-RUN { return $!of.bless }
my $data := $!st-handler.row;
return IterationEnd if $data =:= IterationEnd or not $data;
my $obj = $!of.^new-from-data($data);
$obj.^clean-up;
$obj.^saved-on-db;
return .($obj) with &!post;
$obj
}