我发现了一个很棒的库juji/editscript,该库可以对任何嵌套的clojure数据结构进行差异化和修补。最重要的是,我想实现一个函数(diff3 a o b)
,其中o是a和b的共同祖先。
直接的解决方案是将两个diff的编辑脚本串联起来。
输入:
(def o {:a 1 :b 2})
(def a {:a 1 :b 2 :c 3})
(def b {:a 1 :b 2 :d 4})
差异(修改稿):
(editscript.core/diff o a)
; => [[[:c] :+ 3]]
(editscript.core/diff o b)
; => [[[:d] :+ 4]]
合并(串联)编辑脚本:
(editscript.edit/combine
(editscript.core/diff o a)
(editscript.core/diff o b))
; => [[[:c] :+ 3]
[[:d] :+ 4]]
修补:
(editscript.core/patch
o
(editscript.edit/combine
(editscript.core/diff o a)
(editscript.core/diff o b)))
; => {:a 1, :b 2, :c 3, :d 4}
但是当a
和b
中的同一个位置发生并发更新时,我坚持检测冲突:
(def o {:a {:b 1}})
(def a {:a nil})
(def b {:a {:b 2}})
(editscript.edit/combine
(editscript.core/diff o a)
(editscript.core/diff o b))
; => [[[:a] :r nil]
; [[:a :b] :r 2]]
(editscript.core/patch
o
(editscript.edit/combine
(editscript.core/diff o a)
(editscript.core/diff o b)))
; throws exception
是否有已知的解决方案或算法来遍历那些编辑脚本并找到冲突的节点?