Acme-Array-MaxSize

 view release on metacpan or  search on metacpan

lib/Acme/Array/MaxSize.pm  view on Meta::CPAN

sub FETCHSIZE {
    my $self = shift;
    @$self
}

sub STORESIZE {
    my ($self, $count) = @_;
    if ($count > $max_size{$self}) {
        carp 'Array too long';
        $count = $max_size{$self};
    }
    $#{$self} = $count - 1;
}

sub SPLICE {
    my ($self, $offset, $length, @list) = @_;
    if ($offset > $max_size{$self}) {
        carp 'Array too long';
        return;
    }

    if ($offset + $length > $max_size{$self}) {
        carp 'Array too long';
        $length = $max_size{$self} - $offset;
    }

    my $asked = @$self - $length + @list;
    if ($asked > $max_size{$self}) {
        carp 'Array too long';
        if ($offset == 0) {
            splice @list, 0, $asked - $max_size{$self};
        } else {
            splice @list, $max_size{$self} - $asked;
        }
    }
    $self->SUPER::SPLICE($offset, $length, @list);
}


=head1 NAME

Acme::Array::MaxSize - Limit the maximal size your arrays can get.

=head1 VERSION

Version 0.04

=cut

our $VERSION = '0.04';


=head1 SYNOPSIS

Your array will never grow bigger over a given limit.

  use Acme::Array::MaxSize;

  tie my @short, 'Acme::Array::MaxSize', 3;
  @short = (1 .. 10);
  print "@short";  # 1 2 3

=head1 DETAILS

When adding new elements, if the maximal size is reached, all other
elements are thrown away.

  tie my @short, 'Acme::Array::MaxSize', 3;
  @short = ('a');
  push @short, 'b' .. 'h';
  print "@short";  # a b c

Inserting elements at the B<very beginning> behaves differently,
though. Each C<unshift> or C<splice> would insert the maximal possible
number of elements B<at the end> of the inserted list:

  tie my @short, 'Acme::Array::MaxSize', 3;
  @short = ('a');
  unshift @short, 'b' .. 'h';
  print "@short";  # g h a

=head1 AUTHOR

E. Choroba, C<< <choroba at cpan.org> >>

=head1 BUGS

Please report any bugs or feature requests to the GitHub repository
L<https://github.com/choroba/Acme-Array-MaxSize/issues>, or
C<bug-acme-array-maxsize at rt.cpan.org>, or through the web interface
at
L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Acme-Array-MaxSize>.
I will be notified, and then you'll automatically be notified of
progress on your bug as I make changes.

=head1 SUPPORT

You can find documentation for this module with the perldoc command.

    perldoc Acme::Array::MaxSize


You can also look for information at:

=over 4

=item * Meta CPAN

L<https://metacpan.org/pod/Acme::Array::MaxSize>

=item * GitHub Repository

L<https://github.com/choroba/Acme-Array-MaxSize/>

=item * RT: CPAN's request tracker (report bugs here)

L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Acme-Array-MaxSize>

=item * Search CPAN

L<https://metacpan.org/dist/Acme-Array-MaxSize/>

=back


=head1 ACKNOWLEDGEMENTS

Dedicated to L<Discipulus|http://www.perlmonks.org/?node=Discipulus>.

=head1 LICENSE AND COPYRIGHT

Copyright 2016-2022 E. Choroba.

This program is free software; you can redistribute it and/or modify it
under the terms of the the Artistic License (2.0). You may obtain a
copy of the full license at:

L<http://www.perlfoundation.org/artistic_license_2_0>

Any use, modification, and distribution of the Standard or Modified



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