Created
April 26, 2012 22:05
-
-
Save ninjudd/2503552 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| (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