#!/usr/bin/perl

use blib;
use Benchmark;
use Algorithm::Permute;
use List::Permutor;								# Tom Phoenix's
require '/home/edwin/docs/majalah/2/mjd_permute';	# MJD's
require '/home/edwin/docs/majalah/2/Permutations.pm';	# Abigail's

my @arr = (1..9);

$p = new Algorithm::Permute([@arr]);
$l = new List::Permutor (@arr);

#permute([split], []);
sub permute{
	my @items = @{ $_[0] };
	my @perms = @{ $_[1] };
	unless (@items) {
#		print "@perms\n";
		@res = @perms;
	} else {
		my(@newitems,@newperms,$i);
		foreach $i (0 .. $#items) {
			@newitems = @items;
    		@newperms = @perms;
    		unshift(@newperms, splice(@newitems, $i, 1));
    		permute([@newitems], [@newperms]);
    	}
	}
}

sub mjd_permute {
    my @data = @_;
    my $num_permutations = factorial(scalar @data);
    for (my $i=0; $i < $num_permutations; $i++) {
        my @permutation = @data[n2perm($i, $#data)];
#        print "@permutation\n";
    }
}

timethese(5, {
#	'Abigail\'s'	=> sub { 
#		@res = Combinatorial::Permutations::permutate(@arr) },
	'MJD\'s'	=> sub { mjd_permute(@arr) },
	'perlfaq4'	=> sub { permute([@arr], []) },
	'Algorithm::Permute' => sub { while (@res = $p->next) {} },
	'List::Permutor'		 => sub { while (@res = $l->next) {} },
	});
