(defstruct disjoint-set
elements)
(defun make-disjoint-set (elements)
(make-disjoint-set :elements elements))
(defun partition (disjoint-set)
(loop for element in (disjoint-set-elements disjoint-set)
collect
(let ((found (find element (mapcar #'first (rest disjoint-set))
:test #'equal)))
(if found
(acons element element found :test #'equal)
(acons element element nil :test #'equal)))))