Acme-JMOLLY-Utils
view release on metacpan or search on metacpan
lib/Tie/Cycle.pm view on Meta::CPAN
package Tie::Cycle;
use strict;
our $VERSION = '1.21';
use Carp qw(carp);
use constant CURSOR_COL => 0;
use constant COUNT_COL => 1;
use constant ITEM_COL => 2;
sub TIESCALAR {
my( $class, $list_ref ) = @_;
my $self = bless [], $class;
unless( $self->STORE( $list_ref ) ) {
carp "The argument to Tie::Cycle must be an array reference";
return;
}
return $self;
}
sub FETCH {
my( $self ) = @_;
my $index = $self->[CURSOR_COL]++;
$self->[CURSOR_COL] %= $self->_count;
return $self->_item( $index );
}
sub STORE {
my( $self, $list_ref ) = @_;
return unless ref $list_ref eq ref [];
my @shallow_copy = map { $_ } @$list_ref;
$self->[CURSOR_COL] = 0;
$self->[COUNT_COL] = scalar @shallow_copy;
$self->[ITEM_COL] = \@shallow_copy;
}
sub reset { $_[0]->[CURSOR_COL] = 0 }
sub previous {
my( $self ) = @_;
my $index = $self->_cursor - 1;
$self->[CURSOR_COL] %= $self->_count;
return $self->_item( $index );
}
sub next {
my( $self ) = @_;
my $index = $self->_cursor + 1;
$self->[CURSOR_COL] %= $self->_count;
return $self->_item( $index );
}
sub _cursor { $_[0]->[CURSOR_COL] }
sub _count { $_[0]->[COUNT_COL] }
sub _item {
my( $self, $index ) = @_;
$index = defined $index ? $index : $self->_cursor;
$self->[ITEM_COL][ $index ]
}
"Tie::Cycle";
__END__
=encoding utf8
=head1 NAME
Tie::Cycle - Cycle through a list of values via a scalar.
=head1 SYNOPSIS
use v5.10.1;
use Tie::Cycle;
tie my $cycle, 'Tie::Cycle', [ qw( FFFFFF 000000 FFFF00 ) ];
say $cycle; # FFFFFF
say $cycle; # 000000
say $cycle; # FFFF00
say $cycle; # FFFFFF back to the beginning
(tied $cycle)->reset; # back to the beginning
=head1 DESCRIPTION
( run in 0.890 second using v1.01-cache-2.11-cpan-5a3173703d6 )