AnyEvent-Tools
view release on metacpan or search on metacpan
lib/AnyEvent/Tools/Pool.pm view on Meta::CPAN
use utf8;
use strict;
use warnings;
package AnyEvent::Tools::Pool;
use Carp;
use AnyEvent::Util;
sub new
{
my $class = shift;
my $self = bless {
pool => {},
no => 0,
queue => [],
free => [],
delete => [],
} => ref($class) || $class;
$self->push($_) for @_;
return $self;
}
sub delete
{
my ($self, $no, $cb) = @_;
croak "Can't find object: $no" unless exists $self->{pool}{$no};
croak "Callback must be CODEREF" if $cb and ref($cb) ne 'CODE';
push @{ $self->{delete} }, [ $no, $cb ];
$self->_check_pool;
return;
}
sub push :method
{
croak 'usage: $pool->push($object)' unless @_ == 2;
my ($self, $object) = @_;
my $no = $self->{no}++;
push @{ $self->{free} }, $no;
$self->{pool}{$no} = $object;
$self->_check_pool;
return $no;
}
sub get
{
croak 'usage: $pool->get(sub { ($g, $o) = @_ .. })' unless @_ == 2;
my ($self, $cb) = @_;
croak 'Callback must be coderef', unless 'CODE' eq ref $cb;
push @{ $self->{queue} }, $cb;
$self->_check_pool;
return;
}
sub _check_pool
{
( run in 0.570 second using v1.01-cache-2.11-cpan-39bf76dae61 )