Future-Buffer
view release on metacpan or search on metacpan
lib/Future/Buffer.pm view on Meta::CPAN
return unpack $format, substr( $$dref, 0, $len, "" );
}
);
}
=head2 unread
$buffer->unread( $data );
I<Since version 0.03.>
Prepends more data back into the buffer,
It is uncommon to need this method, but it may be useful in certain situations
such as when it is hard to determine upfront how much data needs to be read
for a single operation, and it turns out too much was read. The trailing
content past what is needed can be put back for a later operation.
Note that use of this method causes an inherent race condition between
outstanding read futures and existing data in the buffer. If there are no
pending futures then this is safe. If there is no existing data already in the
buffer this is also safe. If neither of these is true then a warning is
printed indicating that the logic of the caller is not well-defined.
=cut
sub unread
{
my $self = shift;
my ( $data ) = @_;
if( @{ $self->{pending} } and length $self->{data} ) {
warn "Racy use of ->unread with both pending read futures and existing data";
}
$self->{data} = $data . $self->{data};
$self->_invoke_pending if @{ $self->{pending} };
return Future->done;
}
=head1 TODO
=over 4
=item *
An "on-read" event, taking maybe inspiration from L<IO::Async::Stream>. This
would allow both pull- and push-based consumers.
=item *
Size limitation. Allow an upper bound of stored data, make C<write> calls
return pending futures until buffer can accept it. Needs consideration of
unbounded C<read_until> though.
=item *
Consider extensions of the L</read_unpacked> method to handle more situations.
This may require building a shared CPAN module for doing streaming-unpack
along with C<IO::Handle::Packable> and other situations.
=back
=head1 AUTHOR
Paul Evans <leonerd@leonerd.org.uk>
Inspired by L<Ryu::Buffer> by Tom Molesworth <TEAM@cpan.org>
=cut
0x55AA;
( run in 1.921 second using v1.01-cache-2.11-cpan-140bd7fdf52 )