## list-cross-product.pkg
# Compiled by:
#
src/lib/std/standard.lib# Functions for computing with the cross product of two lists.
### "Future history will be a race
### between education and catastrophe."
###
### -- H.G. Wells
package list_cross_product
: (weak) List_Cross_Product # List_Cross_Product is from
src/lib/src/list-cross-product.api{
# Apply a function to the cross product of two lists:
#
fun apply_x f (l1, l2)
=
lp1 l1
where
fun lp1 [] => ();
lp1 (x ! r)
=>
{ fun lp2 [] => lp1 r;
lp2 (y ! r)
=>
{ f (x, y);
lp2 r;
};
end;
lp2 l2;
};
end;
end;
# Map a function across the cross product of two lists:
#
fun map_x f (l1, l2)
=
{ fun lp1 ([], result_l)
=>
reverse result_l;
lp1 (x ! r, result_l)
=>
{ fun lp2 ([], result_l)
=>
lp1 (r, result_l);
lp2 (y ! r, result_l)
=>
lp2 (r, f (x, y) ! result_l);
end;
lp2 (l2, result_l);
};
end;
lp1 (l1, []);
};
# Fold a function across the cross product of two lists:
#
fun fold_x f (l1, l2)
=
{ fun lp1 ([], accum)
=>
accum;
lp1 (x ! r, accum)
=>
{ fun lp2 ([], accum) => lp1 (r, accum);
lp2 (y ! r, accum) => lp2 (r, f (x, y, accum));
end;
lp2 (l2, accum);
};
end;
\\ init = lp1 (l1, init);
};
}; # package list_cross_product
## COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See SMLNJ-COPYRIGHT file for details.
## Subsequent changes by Jeff Prothero Copyright (c) 2010-2015,
## released per terms of SMLNJ-COPYRIGHT.