Algorithm-SlidingWindow-Dynamic

 view release on metacpan or  search on metacpan

lib/Algorithm/SlidingWindow/Dynamic.pm  view on Meta::CPAN

package Algorithm::SlidingWindow::Dynamic;

use strict;
use warnings;
use Carp qw(croak);

our $VERSION = '0.900';

sub new {
    my ($class, %args) = @_;

    my $alloc = exists $args{alloc} ? $args{alloc} : 8;
    _check_alloc($alloc);
    $alloc = int($alloc);

    my $self = bless {
        buf  => [ (undef) x $alloc ],
        head => 0,
        size => 0,
    }, $class;

    if (exists $args{values}) {
        croak "values must be an arrayref" if ref($args{values}) ne 'ARRAY';
        $self->push(@{ $args{values} });
    }

    return $self;
}

sub size { $_[0]->{size} }

sub is_empty { $_[0]->{size} == 0 ? 1 : 0 }

sub oldest {
    my ($self) = @_;
    return undef if $self->{size} == 0;
    return $self->{buf}[ $self->{head} ];
}

sub newest {
    my ($self) = @_;
    return undef if $self->{size} == 0;

    my $cap = _cap($self);
    my $idx = ($self->{head} + $self->{size} - 1) % $cap;
    return $self->{buf}[$idx];
}

sub get {
    my ($self, $index) = @_;
    return undef if !defined $index;
    return undef if $index !~ /\A\d+\z/;
    return undef if $index >= $self->{size};

    my $idx = ($self->{head} + $index) % _cap($self);
    return $self->{buf}[$idx];
}

sub values {
    my ($self) = @_;
    my $n = $self->{size};
    return () if $n == 0;

    my $cap  = _cap($self);
    my $head = $self->{head};
    my $buf  = $self->{buf};

    return map { $buf->[ ($head + $_) % $cap ] } (0 .. $n - 1);
}

sub clear {
    my ($self) = @_;
    my $cap = _cap($self);

    for (my $i = 0; $i < $cap; $i++) {
        $self->{buf}[$i] = undef;



( run in 0.706 second using v1.01-cache-2.11-cpan-39bf76dae61 )