File-KDBX
view release on metacpan or search on metacpan
lib/File/KDBX/Iterator.pm view on Meta::CPAN
package File::KDBX::Iterator;
# ABSTRACT: KDBX database iterator
use warnings;
use strict;
use File::KDBX::Error;
use File::KDBX::Util qw(:class :load :search);
use Iterator::Simple;
use Module::Loaded;
use Ref::Util qw(is_arrayref is_coderef is_ref is_scalarref);
use namespace::clean;
BEGIN { mark_as_loaded('Iterator::Simple::Iterator') }
extends 'Iterator::Simple::Iterator';
our $VERSION = '0.906'; # VERSION
sub new {
my $class = shift;
my $code = is_coderef($_[0]) ? shift : sub { undef };
my $items = @_ == 1 && is_arrayref($_[0]) ? $_[0] : \@_;
return $class->SUPER::new(sub {
if (@_) { # put back
if (@_ == 1 && is_arrayref($_[0])) {
$items = $_[0];
}
else {
unshift @$items, @_;
}
return;
}
else {
my $next = shift @$items;
return $next if defined $next;
return $code->();
}
});
}
sub next {
my $self = shift;
my $code = shift or return $self->();
$code = query_any($code, @_);
while (defined (local $_ = $self->())) {
return $_ if $code->($_);
}
return;
}
sub peek {
my $self = shift;
my $next = $self->();
$self->($next) if defined $next;
return $next;
}
sub unget {
my $self = shift; # Must shift in a statement before calling.
$self->(@_);
}
( run in 2.143 seconds using v1.01-cache-2.11-cpan-75ffa21a3d4 )