Skip to content

Instantly share code, notes, and snippets.

@ninjudd
Created May 10, 2012 23:23
Show Gist options
  • Select an option

  • Save ninjudd/2656530 to your computer and use it in GitHub Desktop.

Select an option

Save ninjudd/2656530 to your computer and use it in GitHub Desktop.
(defn- merge-edges [over-layer incoming? edges-seq]
(->> (for [[i edges] (indexed (reverse edges-seq))
[id edge] edges]
(let [pos (merge-position over-layer id)
head (or (merge-head over-layer id) id)]
[(if incoming? [pos i], [i pos])
{head edge} id]))
(sort-by first #(compare %2 %1))
(map second)
(apply merge-with adjoin)))
(defn merge-nodes [over-layer keyseq nodes]
(if-let [ks (edges-keyseq keyseq)]
(let [edges (merge-edges over-layer
(= :meta (first keyseq))
(map #(get-in % ks) nodes))]
(-> (reduce adjoin nil
(map #(dissoc-in* % ks) nodes))
(given (seq edges)
(assoc-in* ks edges))))
(reduce adjoin nil nodes)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment