Acme-List-CarCdr
view release on metacpan or search on metacpan
lib/Acme/List/CarCdr.pm view on Meta::CPAN
# -*- Perl -*-
#
# c[ad]+r list-operation support for Perl, based on (car) and (cdr) and
# so forth of lisp fame, though with a limit of 704 as to the maximum
# length any such shenanigans.
#
# Run perldoc(1) on this file for additional documentation.
package Acme::List::CarCdr;
use 5.010000;
use strict;
use warnings;
use Carp qw(croak);
use Moo;
our $VERSION = '0.01';
##############################################################################
#
# METHODS
sub AUTOLOAD {
my $method = our $AUTOLOAD;
if ( $method =~ m/::c([ad]{1,704})r$/ ) {
my $ops = reverse $1;
my $self = shift;
my $ref = \@_;
my $start = 0;
my $end;
my $delve = 0;
while ( $ops =~ m/\G([ad])(\1*)/cg ) {
my $op = $1;
my $len = length $2 || 0;
if ( $op eq 'a' ) {
if ( $len > 0 ) {
for my $i ( 1 .. $len ) {
if ( ref $ref->[$start] ne 'ARRAY' ) {
croak "$method: " . $ref->[$start] . " is not a list";
}
$ref = $ref->[$start];
$start = 0;
}
}
$end = $start;
$delve = 1;
} else { # $op eq 'd'
if ($delve) {
if ( ref $ref->[$start] ne 'ARRAY' ) {
croak "$AUTOLOAD: " . $ref->[$start] . " is not a list";
}
$ref = $ref->[$start];
$start = 0;
}
$start += $len + 1;
$end = $#$ref;
}
}
return if $start > $end;
return @{ $ref->[$start] }
if ( $start == $end and ref $ref->[$start] eq 'ARRAY' );
return @$ref[ $start .. $end ];
} else {
croak "no such method $method";
}
}
1;
__END__
##############################################################################
#
# DOCS
=head1 NAME
Acme::List::CarCdr - car cdr cdaadadrdrr
=head1 SYNOPSIS
use Acme::List::CarCdr;
my $can = Acme::List::CarCdr->new;
$can->car(qw/cat dog fish/); # "cat"
$can->cdr(qw/cat dog fish/); # "dog", "fish"
$can->cddr(qw/cat dog fish/); # "fish"
$can->c...r(...); # ...
See also the C<t/> directory of the distribution of this module for
example code.
=head1 DESCRIPTION
C<car> or C<cdr> or C<caar> or C<cadadr> or so forth support for Perl.
( run in 1.247 second using v1.01-cache-2.11-cpan-364913b4093 )