Data::Stream::Bulk::Cat - Concatenated streams


Data-Stream-Bulk documentation Contained in the Data-Stream-Bulk distribution.

Index


Code Index:

NAME

Top

Data::Stream::Bulk::Cat - Concatenated streams

SYNOPSIS

Top

    use Data::Stream::Bulk::Cat;

    Data::Stream::Bulk::Cat->new(
        streams => [ $s1, $s2, $s3 ],
    );

DESCRIPTION

Top

This stream is a concatenation of several other streams.

METHODS

Top

is_done

Returns true if the list of streams is empty.

next

Returns the next block from the next ready stream.

list_cat

Breaks down the internal list of streams, and delegates list_cat to the first one.

Has the effect of inlining the nested streams into the total concatenation, allowing list_cat in Data::Stream::Bulk::Array to work better.

AUTHOR

Top

Yuval Kogman <nothingmuch@woobling.org>

COPYRIGHT AND LICENSE

Top


Data-Stream-Bulk documentation Contained in the Data-Stream-Bulk distribution.

package Data::Stream::Bulk::Cat;
BEGIN {
  $Data::Stream::Bulk::Cat::AUTHORITY = 'cpan:NUFFIN';
}
BEGIN {
  $Data::Stream::Bulk::Cat::VERSION = '0.08';
}
# ABSTRACT: Concatenated streams

use Moose;

use namespace::clean -except => 'meta';

with qw(Data::Stream::Bulk) => { -excludes => 'list_cat' };

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__