with Enumerable

RubyライクなEnumerable roleを作ってみた。

#!perl
package IO::Enumerable;
use Any::Moose; # requires Mouse 0.39

with 'Enumerable';

has handle => (
    is  => 'rw',
    isa => 'FileHandle',
);

sub each{
    my($self, $block) = @_;

    my $handle = $self->handle;
    local $_;
    while(<$handle>){
        $block->($_);
    }
}
package main;

my $io = IO::Enumerable->new(handle => \*DATA);
print $io->map(sub{ chomp; $_ })
    ->grep(qr/^b/)
    ->sort
    ->join(' '), "\n"; # => bar baz
__DATA__
foo
bar
baz

これはこれで便利ではあるが,これだとあまりにRuby的すぎる。Ruby的にするためにパフォーマンスが犠牲になっているので,それはまずい。CPANに上げるのはインターフェイスをもう少し考えてからにする。