Next Advanced Programming Techniques Slide #70

Merge Factory

        sub make_merger {     
          my ($cmp) = @_;
          return sub {
            my ($s, $t) = @_;
            if (is_empty($s)) { return $t }
            if (is_empty($t)) { return $s }
            my ($sh, $th) = (head($s), head($t));
            my $dir = $cmp->($sh, $th);
            if ($dir <= 0) {
              node($sh, sub { merge(tail($s), $t      ) });
            } else {
              node($th, sub { merge($s      , tail($t)) });
            } 
          };
        }
        $merge_alphabetic = make_merger(sub { $_[0] cmp $_[1] });
        $merge_numeric    = make_merger(sub { $_[0] <=>  $_[1] });


Next Copyright © 2000 M-J. Dominus