package Data::Enumerator::Product;
use strict;
use warnings;
use base qw/Data::Enumerator::Base/;
sub __flatten{
my ( $array ) = @_;
return $array unless ref $array;
return $array unless ref $array eq 'ARRAY';
return @$array;
}
sub iterator {
my ( $self ) = @_;
my ( $a,$b ) = @{ $self->object };
my $iter_a = $a->iterator;
my $iter_b = $b->iterator;
my $value_a = $iter_a->();
my $iterator;$iterator = sub {
while(1){
my $value_b = $iter_b->();
if( $self->is_last( $value_a )){
# aが最後までいったら終了
return $self->LAST;
}
if( $self->is_last($value_b)){
# 最後まで行ったら、iterator再生成
$iter_b = $b->iterator;
# aを次の値にする
$value_a = $iter_a->();
# この条件でもう一度
next;
}
return [__flatten($value_a),__flatten($value_b)];
}
};
return $iterator;
}
1;