1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| Taisha:~/perl/forum $ cat Prop.pm
use strict;
use warnings;
package Prop;
sub new {
my ($class, %h) = @_;
my ($reader, $writer, $starter, $combiner, $builder) = @h{qw(reader writer starter combiner builder)};
bless [undef, $reader, $writer, $starter, $combiner, $builder], $class;
}
sub set_reader {
my $self = shift;
$self->[1] = shift;
}
sub step {
my $self = shift;
my ($writer, $starter, $combiner, $builder) = @{$self}[2..5];
for my $item (@_) {
my $group = $self->[0];
if (!defined($group) or $starter->($group, $item)) {
$writer->($group) if defined($group);
$self->[0] = $builder->($item);
} else {
$combiner->($group, $item);
}
}
}
sub finish {
my $self = shift;
my ($group, $writer) = @{$self}[0,2];
$writer->($group) if defined($group);
$self->[0] = undef;
}
sub slurp {
my $self = shift;
my $reader = $self->[1];
while (defined(my $item = $reader->())) {
step($self, $item);
}
finish($self);
}
1;
Taisha:~/perl/forum $ |