Adapter-Async
view release on metacpan or search on metacpan
lib/Adapter/Async/OrderedList/Array.pm view on Meta::CPAN
package Adapter::Async::OrderedList::Array;
$Adapter::Async::OrderedList::Array::VERSION = '0.019';
use strict;
use warnings;
use parent qw(Adapter::Async::OrderedList);
=head1 NAME
Adapter::Async::OrderedList::Array - arrayref adapter
=head1 VERSION
version 0.018
=head1 DESCRIPTION
See L<Adapter::Async::OrderedList> for the API.
=cut
sub new {
my $self = shift->SUPER::new(@_);
$self->{data} ||= [];
$self
}
sub clear {
my $self = shift;
@{$self->{data}} = ();
$self->bus->invoke_event('clear');
Future->wrap
}
sub splice:method {
my ($self, $idx, $len, $data) = @_;
$idx ||= 0;
$data ||= [];
my @rslt = splice @{$self->{data}}, $idx, $len, @$data;
$self->bus->invoke_event(splice => $idx, $len, $data => \@rslt);
Future->wrap($idx, $len, $data, \@rslt);
}
# XXX weakrefs
sub move {
my ($self, $idx, $len, $offset) = @_;
my @data = splice @{$self->{data}}, $idx, $len;
splice @{$self->{data}}, $idx + $offset, 0, @data;
$self->bus->invoke_event(move => $idx, $len, $offset);
Future->wrap($idx, $len, $offset);
}
# XXX needs updating
sub modify {
my ($self, $idx, $data) = @_;
die "row out of bounds" unless @{$self->{data}} >= $idx;
$self->{data}[$idx] = $data;
$self->bus->invoke_event(modify => $idx, $data);
Future->wrap
}
sub delete {
my ($self, $idx) = @_;
$self->splice($idx, 1, [])
}
# Locate matching element (via eq), starting at the given index
# and iterating either side until we hit it. For cases where splice
# activity may have moved the element but we're not expecting it to
# have gone far.
sub find_from {
my ($self, $idx, $data) = @_;
my $delta = 0;
my $end = $#{$self->{data}};
$idx = $end if $idx > $end;
$idx = 0 if $idx < 0;
ITEM:
while(1) {
if($idx + $delta <= $end) {
return Future->wrap(
$idx + $delta
) if $self->{data}[$idx + $delta] eq $data;
}
( run in 1.364 second using v1.01-cache-2.11-cpan-f56aa216473 )