Algorithm-SlidingWindow

 view release on metacpan or  search on metacpan

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

sub oldest {
    my $self = $_[0];
    return undef if $self->{_size} == 0;
    return $self->{_buf}[ $self->{_head} ];
}

sub newest {
    my $self = $_[0];

    my $size = $self->{_size};
    return undef if $size == 0;

    my $cap  = $self->{_cap};
    my $head = $self->{_head};

    my $i = $head + $size - 1;
    $i -= $cap if $i >= $cap;

    return $self->{_buf}[$i];
}

1;

__END__

=head1 NAME

Algorithm::SlidingWindow - Fixed-capacity sliding window (overwrite-oldest)

=head1 SYNOPSIS

    use Algorithm::SlidingWindow;

    my $w = Algorithm::SlidingWindow->new(
        capacity => 5,
        on_evict => sub {
            my ($old) = @_;
            warn "evicted $old\n";
        },
    );

    $w->add(1, 2, 3);
    $w->add(4, 5, 6);   # evicts 1

    my @vals = $w->values;   # (2, 3, 4, 5, 6)

    my $oldest = $w->oldest; # 2
    my $newest = $w->newest; # 6

    my $x = $w->get(1);      # 3

    $w->clear;

=head1 DESCRIPTION

C<Algorithm::SlidingWindow> implements a fixed-capacity sliding window
using an array-backed circular buffer.

When the window reaches capacity and new elements are added, the oldest
elements are automatically evicted. Eviction is normal behavior and is
not considered an error.

The module is designed to:

=over 4

=item *

Handle all Perl scalar types equally (numbers, strings, references, objects)

=item *

Release references immediately when elements are evicted or cleared

=item *

Avoid unnecessary method calls and minimize call stack depth

=item *

Provide predictable O(1) insertion and access behavior

=back

=head1 CONSTRUCTOR

=head2 new

    my $w = Algorithm::SlidingWindow->new(%args);

Creates a new sliding window.

=head3 Arguments

=over 4

=item capacity => INT (required)

The maximum number of elements the window can hold.
Must be a positive integer greater than zero.

=item on_evict => CODEREF (optional)

A callback invoked whenever an element is evicted due to overflow.

The callback is called as:

    $on_evict->($old_value);

where C<$old_value> is the exact scalar being evicted.

=back

=head3 Returns

A new C<Algorithm::SlidingWindow> object.

=head1 METHODS

=head2 add



( run in 1.091 second using v1.01-cache-2.11-cpan-c966e8aa7e8 )