# generic bubble sort in Perl
# written Oct 02 by Ulrich Stern

sub mysort {
  my ($ar, $n, $cmp) = @_;
  for (my $i=0; $i<$n-1; $i++) {
    for (my $j=$n-1; $j>$i; $j--) {
      if (! &$cmp($$ar[$j-1], $$ar[$j])) {
        my $tmp = $$ar[$j-1];
        $$ar[$j-1] = $$ar[$j];
        $$ar[$j] = $tmp;
      }
    }
  }
}

{
  package Range;
  sub new {
    my ($class, $lb, $ub) = @_;
    return bless { lb => $lb, ub => $ub }, $class;
  }
  sub toString { my $s = shift; return "[$$s{lb},$$s{ub}]"; }
}

sub compLB {
  my ($a, $b) = @_;
  return $$a{lb} < $$b{lb};
}

sub compUB {
  my ($a, $b) = @_;
  return $$a{ub} < $$b{ub};
}

sub main
{
  my $N = 10000;
  my @a = ();

  for (my $i=0; $i<$N; $i++) {
    $a[$i] = new Range($i*7%1000, $i*13%1000);
  }

  print "sorting $N Ranges...\n";

  mysort(\@a, $N, \&compLB);
  mysort(\@a, $N, \&compUB);

  print "done\n";
}

main();

