forked from nothingmuch/data-stream-bulk
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
11d8cf4
commit 760fe64
Showing
5 changed files
with
249 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
#!/usr/bin/perl | ||
|
||
package Data::Stream::Bulk::Cat; | ||
use Moose; | ||
|
||
use namespace::clean -except => 'meta'; | ||
|
||
with qw(Data::Stream::Bulk); | ||
|
||
has streams => ( | ||
isa => "ArrayRef[Data::Stream::Bulk]", | ||
is => "ro", | ||
required => 1, | ||
); | ||
|
||
sub is_done { | ||
my $self = shift; | ||
@{ $self->streams } == 0; | ||
} | ||
|
||
sub next { | ||
my $self = shift; | ||
|
||
my $s = $self->streams; | ||
|
||
return unless @$s; | ||
|
||
my $next; | ||
|
||
until ( $next = @$s && $s->[0]->next ) { | ||
shift @$s; | ||
return unless @$s; | ||
} | ||
|
||
return $next; | ||
} | ||
|
||
sub list_cat { | ||
my ( $self, @rest ) = @_; | ||
my ( $head, @tail ) = ( @{ $self->streams }, @rest ); | ||
return () unless $head; | ||
return $head->list_cat(@tail); | ||
} | ||
|
||
__PACKAGE__->meta->make_immutable; | ||
|
||
__PACKAGE__ | ||
|
||
__END__ | ||
=pod | ||
=head1 NAME | ||
Data::Stream::Bulk::Cat - Concatenated streams | ||
=head1 SYNOPSIS | ||
use Data::Stream::Bulk::Cat; | ||
Data::Stream::Bulk::Cat->new( | ||
streams => [ $s1, $s2, $s3 ], | ||
); | ||
=head1 DESCRIPTION | ||
This stream is a concatenation of several other streams. | ||
=head1 METHODS | ||
=over 4 | ||
=item is_done | ||
Returns true if the list of streams is empty. | ||
=item next | ||
Returns the next block from the next ready stream. | ||
=item list_cat | ||
Breaks down the internal list of streams, and delegates C<list_cat> to the | ||
first one. | ||
Has the effect of inlining the nested streams into the total concatenation, | ||
allowing L<Data::Stream::Bulk::Array/list_cat> to work better. | ||
=back | ||
=cut | ||
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters