Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/sysread/promises-channel
A coordination channel implemented with Promises
https://github.com/sysread/promises-channel
channel perl promise promises
Last synced: about 1 month ago
JSON representation
A coordination channel implemented with Promises
- Host: GitHub
- URL: https://github.com/sysread/promises-channel
- Owner: sysread
- Created: 2018-12-19T14:03:25.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2019-07-05T18:37:38.000Z (over 5 years ago)
- Last Synced: 2023-08-20T23:13:30.284Z (over 1 year ago)
- Topics: channel, perl, promise, promises
- Language: Perl
- Size: 27.3 KB
- Stars: 0
- Watchers: 2
- Forks: 1
- Open Issues: 1
-
Metadata Files:
- Readme: README.pod
- Changelog: Changes
Awesome Lists containing this project
README
=pod
=encoding UTF-8
=head1 NAME
Promises::Channel - a coordination channel implemented with Promises
=head1 VERSION
version 0.05
=head1 SYNOPSIS
# See notes about recursion in Promises::Cookbook::Recursion
use Promises backend => ['AE'], 'deferred';
use Promises::Channel qw(channel);my $channel = channel
limit => 4;# Use $channel to invert control on an AnyEvent::Handle
$ae_handle->on_read(sub {
my $handle = shift;$handle->push_read(line => sub {
my ($handle, $line) = @_;
$channel->put($line);
});
});$ae_handle->on_error(sub {
$channel->shutdown;
});my $depleted = 0;
$channel->on_shutdown
->then(sub { $depleted = 1 });sub reader {
my ($channel, $line) = @_;
do_stuff $line;# Queue the next read, using done to avoid recursion
$channel->get->done(\&reader);
}$channel->get->then(\&reader);
=head1 DESCRIPTION
A C is a FIFO queue that produces Ls
which resolve to the items added to the queue.=head1 ATTRIBUTES
=head2 limit
Sets an upper boundary on the number of items which may be queued at a time. If
this limit is reached, the promise returned by the next call to L will
not be resolved until there has been a corresponding call to L (or the
channel has been L.Note that decreasing the limit does not retroactively apply to items already
queued, meaning that new callers L will block until the queue has been
drained sufficiently.=head2 is_shutdown
Returns true if the channel has been shutdown. The channel will be
automatically shutdown and drained when demolished.=head1 METHODS
=head2 size
Returns the number of items in the queue. This number is not adjusted to
reflect any queued waiters.=head2 is_full
If a L has been set, returns true if the channel is full and cannot
immediately accept new items.=head2 is_empty
Returns true if there are no items in the queue and there are no pending
deliveries of items from deferred Ls.=head2 put
Adds one or more items to the channel and returns a L that
will resolve to the channel instance after the item has been added (which may
be deferred if L has been set).=head2 get
Returns a L which will resolve to the channel and the next
item queued in the channel.$chan->get->then(sub {
my ($chan, $item) = @_;
...
});=head2 shutdown
Closes the queue. This does not prevent new items from being added. However,
future calls to L will be resolved immediately with C. Any
previously deferred calls to get will be immediately resolved until the channel
is empty, after which any remaining deferrals will be resolved with C.When the channel goes out of scope, it will be shutdown and drained
automatically.=head2 on_shutdown
Returns a promise which will be resolved after the channel has been shut down
and drained. As the channel is shut down when demolished, this promise will
be resolved when the channel goes out of scope as well.=head1 EXPORTS
Nothing is exported by default.
=head2 chan
=head2 channel
Sugar for calling the default constructor. The following lines are equivalent.
my $ch = chan;
my $ch = channel;
my $ch = Promises::Channel->new;=head2 merge
Creates a new merged channel from the supplied L instances.
See L for a detailed explanation.=head1 CONTRIBUTORS
The following people have contributed to this module by supplying new features,
bug reports, or feature requests.=over
=item Erik Huelsmann (EHUELS)
=back
=head1 AUTHOR
Jeff Ober
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2019 by Jeff Ober.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.=cut