Skip to content

Instantly share code, notes, and snippets.

@ninjudd
Created April 26, 2012 22:05
Show Gist options
  • Select an option

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

Select an option

Save ninjudd/2503552 to your computer and use it in GitHub Desktop.
(defn merge-node
"Functional version of merge-node!"
[layer head-id tail-id]
(verify (not= head-id tail-id)
(format "cannot merge %s into itself" tail-id))
(verify (= (type-key head-id) (type-key tail-id))
(format "cannot merge %s into %s because they are not the same type" tail-id head-id))
(let [head-merged (fix (merge-head head-id) #{head-id} nil)
tail-merged (fix (merge-head tail-id) #{tail-id} nil)
start-pos (count (merge-ids head-id))]
(if (= head-id tail-merged)
(printf "warning: %s is already merged into %s\n" tail-id head-id)
(do
(verify (not head-merged)
(format "cannot merge %s into %s because %2$s is already merged into %s"
tail-id head-id head-merged))
(verify (not tail-merged)
(format "cannot merge %s into %s because %1$s is already merged into %s"
tail-id head-id tail-merged))
(let [revision (retro/current-revision layer)]
(reduce (fn [layer [pos id]]
(update-node layer id adjoin {:head head-id :edges {head-id {:rev revision :pos (+ pos start-pos)}}}))
(update-node layer head-id adjoin {:head head-id})
(map-indexed vector (cons tail-id (merged-into tail-id))))))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment