IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

N件ごとに取り出すイタレータ

もっと防御てきにしたほうがいいはず。

~/perl
$ perl -MData::Dumper -MTupleIterator -e '
$a=+[qw/a b c d e f g h/];
$b=TupleIterator::get_tuple_iterator($a,3);
while($b->("more")){print Dumper($b->("next"))};
print Dumper($b->("remain"))
'
$VAR1 = [
          'a',
          'b',
          'c'
        ];
$VAR1 = [
          'd',
          'e',
          'f'
        ];
$VAR1 = [
          [
            'g',
            'h'
          ]
        ];

package TupleIterator;

use strict;
use warnings;

sub get_tuple_iterator {
    my ($list, $num) = @_;
    return sub {
        my $action = shift ;
        if( $action eq 'more'){
            return scalar(@$list)>=$num ? 1 : undef;
        }
        if( $action eq 'next'){
            return +[splice @$list, 0, $num];
        }
        if( $action eq 'remain'){
            return scalar(@$list)<$num ? [$list] : undef    ;
        }
    };
}

1;