#!/usr/bin/perl

# Idiom #312 List equality

use v5.10;
use strict;

say "\n==== Using native perl - flat numeric lists only ====\n";

my @a = ( 1, 2, 3, 4, 5 );
my @b = ( 1, 2, 3, 4, 5, 6 );
my @c = ( 1, 2, 3, 4 );
my @d = ( 'a' .. 'e' );
my @e = ( 1, 002, 3, 4, 5 ); # 002 is 2 in octal
my @f = ( 1, 2, 7, 4, 5 );

sub lcomp {
    my ($a, $b) = @_;

    # *E* length different
    return 0 if ( @$a != @$b );

    my $matched = 1;
    for (my $i=0; $i < @$a; $i++) {
        return 0 unless $a->[$i] == $b->[$i];
    }

    return 1;
}

sub pp { return shift ? 'matched' : 'not matched' }

say 'lcomp( \@a, \@a )     : ', pp lcomp( \@a, \@a     );
say 'lcomp( \@a, \@f )     : ', pp lcomp( \@a, \@f     );
say 'lcomp( \@a, \@c )     : ', pp lcomp( \@a, \@c     );
say 'lcomp( \@a, \@e )     : ', pp lcomp( \@a, \@e     );
say 'lcomp( \@d, \@d )     : ', pp lcomp( \@d, \@d     );
say 'lcomp( [1], [1] )     : ', pp lcomp( [1], [1]     );
say "** the following didn't match due to (unreported) errors";
say 'lcomp(  @a,  @a )     : ', "dies because arguments aren't validated as array refs";
say 'lcomp( \@a, \@b )     : ', pp lcomp( \@a, \@b     );
say 'lcomp( \@a, \@d )     : ', pp lcomp( \@a, \@d     );
say 'lcomp( [[1]], [[1]] ) : ', pp lcomp( [[1]], [[1]] );
