NAME
DR::Tarantool::Iterator - iterator/container class for DR::Tarantool
SYNOPSIS
use DR::Tarantool::Iterator;
my $iter = DR::Tarantool::Iterator->new([1, 2, 3]);
my $item0 = $iter->item(0);
my @all = $iter->all;
my $all = $iter->all;
while(my $item = $iter->next) {
do_something_with_item( $item );
}
METHODS
new
Constructor.
Arguments
Array of items.
List of named arguments, that can be:
- item_class
-
Name of class to bless/construct item. If the field is 'ARRAYREF' then the first element of the array is item_class, and the second element is item_constructor.
- item_constructor
-
Name of constructor for item. If the value is undefined and item_class is defined, iterator will bless value instead construct.
If item_constructor is used, constructor method will be receive three arguments: item, item_index and iterator.
my $iter = DR::Tarantool::Iterator->new( [ [1], [2], [3] ], item_class => 'MyClass', item_constructor => 'new' ); my $iter = DR::Tarantool::Iterator->new( # the same [ [1], [2], [3] ], item_class => [ 'MyClass', 'new' ] ); my $item = $iter->item(0); my $item = MyClass->new( [1], 0, $iter ); # the same my $item = $iter->item(2); my $item = MyClass->new( [3], 2, $iter ); # the same
- data
-
Any Your data You want to assign to iterator.
clone(%opt)
clone iterator object (doesn't clone items). It is usable if You want to have iterator that have the other item_class and (or) item_constructor.
If clone_items argument is true, the function will clone itemlist, too.
my $iter1 = $old_iter->clone(item_class => [ 'MyClass', 'new' ]);
my $iter2 = $old_iter->clone(item_class => [ 'MyClass', 'new' ],
clone_items => 1);
$old_iter->sort(sub { $_[0]->name cmp $_[1]->name });
# $iter1 will be resorted, too, but $iter2 will not be
count
returns count of items that are contained in iterator
item
returns one item from iterator by its number (or croaks error for wrong numbers)
raw_item
returns one raw item from iterator by its number (or croaks error for wrong numbers).
The function differ from item: it doesn't know about 'item_class'.
raw_sort(&)
resorts iterator (changes current object). Compare function receives two raw objects:
$iter->raw_sort(sub { $_[0]->field cmp $_[1]->field });
sort(&)
resorts iterator (changes current object). Compare function receives two objects:
$iter->sort(sub { $_[0]->field <=> $_[1]->field });
grep(&)
greps iterator (returns new iterator).
my $admins = $users->grep(sub { $_[0]->is_admin });
raw_grep(&)
greps iterator (returns new iterator). grep function receives raw item.
my $admins = $users->grep(sub { $_[0]->is_admin });
get
The same as item method.
exists
Returns true if iterator contains element with noticed index.
my $item = $iter->exists(10) ? $iter->get(10) : somethig_else();
next
returns next element from iterator (or undef if eof).
while(my $item = $iter->next) {
do_something_with( $item );
}
You can ask current element's number by function 'iter'.
iter
returns current iterator index.
reset
resets iterator index, returns previous index value.
all
returns all elements from iterator.
my @list = $iter->all;
my $list_aref = $iter->all;
my @abc_list = map { $_->abc } $iter->all;
my @abc_list = $iter->all('abc'); # the same
my @list = map { [ $_->abc, $_->cde ] } $iter->all;
my @list = $iter->all('abc', 'cde'); # the same
my @list = map { $_->abc + $_->cde } $iter->all;
my @list = $iter->all(sub { $_[0]->abc + $_->cde }); # the same
item_class
set/returns item class. If the value isn't defined, iterator will bless fields into the class (or calls item_constructor in the class if item_constructor is defined
item_constructor
set/returns item constructor. The value can be used only if item_class is defined.
push
push item into iterator.
data
returns/set user's data assigned to the iterator