debian/changelog: Prepare for next version.
[sod] / src / utilities.lisp
index 1670f55..25733e8 100644 (file)
    and return the result of appending all of the resulting lists."
   (reduce #'append (apply #'mapcar function list more-lists) :from-end t))
 
+(export 'cross-product)
+(defun cross-product (&rest pieces)
+  "Return the cross product of the PIECES.
+
+   Each arguments may be a list, or a (non-nil) atom, which is equivalent to
+   a singleton list containing just that atom.  Return a list of all possible
+   lists which can be constructed by taking one item from each argument list
+   in turn, in an arbitrary order."
+  (reduce (lambda (piece tails)
+           (mapcan (lambda (tail)
+                     (mapcar (lambda (head)
+                               (cons head tail))
+                             (if (listp piece) piece
+                                 (list piece))))
+                   tails))
+         pieces
+         :from-end t
+         :initial-value '(nil)))
+
 (export 'distinguished-point-shortest-paths)
 (defun distinguished-point-shortest-paths (root neighbours-func)
   "Moderately efficient shortest-paths-from-root computation.