List::Enumerator
http://github.com/cho45/list-enumerator/tree/master
昨日 YAPC から帰ってきてからもそもそ作ってたけど妙に疲れた……
やってることは JSEnumerator とだいたい同じで、Moose 使って一部を Role として分離してリストっぽくつかえるやつに適用可能にしてみた、けど、なんかもっといい方法あるのかなぁ。
基本的に全部遅延評価されるので、DBIC の一行ずつとってくるやつと組合せるといいかもしれないけど試してないです。(リストコンテキストで評価した場合一部はリストで返したり、to_a を明示的によぶと ArrayRef 返すようになってたり)
rewind を一応実装してみたのはいいけど、あんまり信用しないほうがいい感じです。結局、クロージャもごもごやる Enumerator をチェインさせたりすると rewind がどうしても実装できないと思う。殆ど場合は問題ないと思うけど……
例によって % 使わない FizzBuzz
use List::Enumerator qw/E/;
use Data::Dumper;
sub p ($) { warn Dumper shift }
my $fizzbuzz =
E(1)->countup->zip(
E("", "", "Fizz")->cycle,
E("", "", "", "", "Buzz")->cycle
)->map(sub {
my ($n, $fizz, $buzz) = @$_;
$fizz . $buzz || $n;
});
p [ $fizzbuzz->take(20) ];
CPAN http://search.cpan.org/~satoh/List-Enumerator-0.01/lib/List/Enumerator.pm