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 )