fix bug where first event isn't passed to filter during collect w/out inside
[catagits/HTML-Zoom.git] / lib / HTML / Zoom / MappedStream.pm
1 package HTML::Zoom::MappedStream;
2
3 use strictures 1;
4 use base qw(HTML::Zoom::StreamBase);
5
6 sub new {
7   my ($class, $args) = @_;
8   bless({
9     _source => $args->{source}, _mapper => $args->{mapper},
10     _zconfig => $args->{zconfig}
11   }, $class);
12 }
13
14 sub _next {
15   my ($self, $am_peek) = @_;
16   return unless $self->{_source};
17   # If we were aiming for a "true" perl-like map then we should
18   # elegantly handle the case where the map function returns 0 events
19   # and the case where it returns >1 - if you're reading this comment
20   # because you wanted it to do that, now would be the time to fix it :)
21   if (my ($next) = $self->{_source}->${\($am_peek ? 'peek' : 'next')}) {
22     $self->{_peeked_from} = $next if $am_peek;
23     local $_ = $next;
24     return $self->{_mapper}->($next);
25   }
26   delete $self->{_source};
27   return
28 }
29
30 1;