|
2 | 2 | (:require [clojure.data :as data] |
3 | 3 | [clj-diff.core :as seq-diff])) |
4 | 4 |
|
5 | | -(declare diff) |
| 5 | +(declare diff diff-similar left-undiff right-undiff) |
6 | 6 |
|
7 | 7 | (defrecord Mismatch [- +]) |
8 | 8 | (defrecord Deletion [-]) |
9 | 9 | (defrecord Insertion [+]) |
10 | 10 |
|
11 | 11 | (defprotocol Diff |
12 | | - (diff-similar [x y])) |
| 12 | + (-diff-similar [x y])) |
13 | 13 |
|
14 | 14 | ;; For property based testing |
15 | 15 | (defprotocol Undiff |
16 | | - (left-undiff [x]) |
17 | | - (right-undiff [x])) |
| 16 | + (-left-undiff [x]) |
| 17 | + (-right-undiff [x])) |
18 | 18 |
|
19 | 19 | (defn- shift-insertions [ins] |
20 | 20 | (reduce (fn [res idx] |
|
126 | 126 | {}) 0] |
127 | 127 | exp-ks)))) |
128 | 128 |
|
| 129 | +(defn- primitive? [x] |
| 130 | + (or (number? x) (string? x) (boolean? x) (inst? x) (keyword? x) (symbol? x))) |
| 131 | + |
129 | 132 | (defn- diff-atom [exp act] |
130 | | - (if #?(:clj (= exp act) |
131 | | - :cljs (= (js->clj exp) (js->clj act))) |
| 133 | + (if (= exp act) |
132 | 134 | exp |
133 | 135 | (->Mismatch exp act))) |
134 | 136 |
|
| 137 | +(defn- diff-similar [x y] |
| 138 | + #?(:clj (-diff-similar x y) |
| 139 | + :cljs |
| 140 | + (if (primitive? x) |
| 141 | + (diff-atom x y) |
| 142 | + (-diff-similar x y)))) |
| 143 | + |
| 144 | +(defn- left-undiff [m] |
| 145 | + #?(:clj (-left-undiff m) |
| 146 | + :cljs |
| 147 | + (if (primitive? m) |
| 148 | + m |
| 149 | + (-left-undiff m)))) |
| 150 | + |
| 151 | +(defn- right-undiff [m] |
| 152 | + #?(:clj (-right-undiff m) |
| 153 | + :cljs |
| 154 | + (if (primitive? m) |
| 155 | + m |
| 156 | + (-right-undiff m)))) |
| 157 | + |
135 | 158 | (defn diff [exp act] |
136 | | - ;; (print "Hola from diff namespace")) |
137 | 159 | (if (= (data/equality-partition exp) (data/equality-partition act)) |
138 | 160 | (diff-similar exp act) |
139 | 161 | (diff-atom exp act))) |
140 | 162 |
|
141 | 163 | #?(:clj (extend nil |
142 | 164 | Diff |
143 | | - {:diff-similar diff-atom}) |
| 165 | + {:-diff-similar diff-atom}) |
144 | 166 | :cljs (extend-type nil |
145 | 167 | Diff |
146 | | - (diff-similar [x y] (diff-atom x y)))) |
| 168 | + (-diff-similar [x y] (diff-atom x y)))) |
147 | 169 |
|
148 | 170 | #?(:clj (extend Object |
149 | 171 | Diff |
150 | | - {:diff-similar (fn [exp act] |
151 | | - (if (.isArray (.getClass ^Object exp)) |
152 | | - (diff-seq exp act) |
153 | | - (diff-atom exp act)))}) |
154 | | - :cljs (extend-type js/Number |
155 | | - Diff |
156 | | - (diff-similar [x y] (diff-atom (js/Number x) (js/Number y))))) |
| 172 | + {:-diff-similar (fn [exp act] |
| 173 | + (if (.isArray (.getClass ^Object exp)) |
| 174 | + (diff-seq exp act) |
| 175 | + (diff-atom exp act)))})) |
157 | 176 |
|
158 | | -#?(:cljs (extend-type js/String |
159 | | - Diff |
160 | | - (diff-similar [x y] (diff-atom (js/String x) (js/String y))))) |
161 | | - |
162 | | -#?(:cljs (extend-type js/Boolean |
163 | | - Diff |
164 | | - (diff-similar [x y] (diff-atom (js/Boolean x) (js/Boolean y))))) |
165 | | - |
166 | | -#?(:cljs (extend-type js/Date |
167 | | - Diff |
168 | | - (diff-similar [x y] (diff-atom (js/Date x) (js/Date y))))) |
169 | 177 |
|
170 | 178 | (extend-protocol Diff |
171 | 179 | #?(:clj java.util.List |
172 | 180 | :cljs cljs.core/List) |
173 | | - (diff-similar [exp act] (diff-seq exp act)) |
| 181 | + (-diff-similar [exp act] (diff-seq exp act)) |
| 182 | + |
| 183 | + #?@(:cljs |
| 184 | + [cljs.core/PersistentVector |
| 185 | + (-diff-similar [exp act] (diff-seq exp act)) |
174 | 186 |
|
175 | | - ;; #?(:clj java.util.Vector |
176 | | - ;; :cljs cljs.core/PersistentVector) |
177 | | - ;; (diff-similar [exp act] (diff-seq exp act))) |
| 187 | + cljs.core/PersistentHashMap |
| 188 | + (-diff-similar [exp act] (diff-map exp act))]) |
178 | 189 |
|
179 | 190 | #?(:clj java.util.Set |
180 | 191 | :cljs cljs.core/PersistentHashSet) |
181 | | - (diff-similar [exp act] |
| 192 | + (-diff-similar [exp act] |
182 | 193 | (let [exp-seq (seq exp) |
183 | 194 | act-seq (seq act)] |
184 | 195 | (set (diff-seq exp-seq (concat (filter act exp-seq) |
185 | 196 | (remove exp act-seq)))))) |
186 | 197 | #?(:clj java.util.Map |
187 | 198 | :cljs cljs.core/PersistentArrayMap) |
188 | | - (diff-similar [exp act] (diff-map exp act))) |
| 199 | + (-diff-similar [exp act] (diff-map exp act))) |
189 | 200 |
|
190 | 201 | (extend-protocol Undiff |
191 | 202 | #?(:clj java.util.List |
192 | 203 | :cljs cljs.core/List) |
193 | | - (left-undiff [s] (map left-undiff (remove #(instance? Insertion %) s))) |
194 | | - (right-undiff [s] (map right-undiff (remove #(instance? Deletion %) s))) |
| 204 | + (-left-undiff [s] (map left-undiff (remove #(instance? Insertion %) s))) |
| 205 | + (-right-undiff [s] (map right-undiff (remove #(instance? Deletion %) s))) |
195 | 206 |
|
196 | 207 | #?(:clj java.util.Set |
197 | 208 | :cljs cljs.core/PersistentHashSet) |
198 | | - (left-undiff [s] (set (left-undiff (seq s)))) |
199 | | - (right-undiff [s] (set (right-undiff (seq s)))) |
| 209 | + (-left-undiff [s] (set (left-undiff (seq s)))) |
| 210 | + (-right-undiff [s] (set (right-undiff (seq s)))) |
200 | 211 |
|
201 | 212 | #?(:clj java.util.Map |
202 | 213 | :cljs cljs.core/PersistentArrayMap) |
203 | | - (left-undiff [m] |
| 214 | + (-left-undiff [m] |
204 | 215 | (into {} |
205 | 216 | (comp (remove #(instance? Insertion (key %))) |
206 | 217 | (map (juxt (comp left-undiff key) (comp left-undiff val)))) |
207 | 218 | m)) |
208 | | - (right-undiff [m] |
| 219 | + (-right-undiff [m] |
209 | 220 | (into {} |
210 | 221 | (comp (remove #(instance? Deletion (key %))) |
211 | 222 | (map (juxt (comp right-undiff key) (comp right-undiff val)))) |
212 | 223 | m)) |
213 | 224 |
|
214 | 225 | Mismatch |
215 | | - (left-undiff [m] (get m :-)) |
216 | | - (right-undiff [m] (get m :+)) |
| 226 | + (-left-undiff [m] (get m :-)) |
| 227 | + (-right-undiff [m] (get m :+)) |
217 | 228 |
|
218 | 229 | Insertion |
219 | | - (right-undiff [m] (get m :+)) |
| 230 | + (-right-undiff [m] (get m :+)) |
220 | 231 |
|
221 | 232 | Deletion |
222 | | - (left-undiff [m] (get m :-))) |
| 233 | + (-left-undiff [m] (get m :-))) |
223 | 234 |
|
224 | | -#?(:clj (extend nil Undiff {:left-undiff identity :right-undiff identity}) |
225 | | - :cljs (extend-type nil Undiff |
226 | | - (left-undiff [m] (identity m)) |
227 | | - (right-undiff [m] (identity m)))) |
| 235 | +(extend-type nil |
| 236 | + Undiff |
| 237 | + (-left-undiff [m] m) |
| 238 | + (-right-undiff [m] m)) |
228 | 239 |
|
229 | | -#?(:clj (extend Object Undiff {:left-undiff identity :right-undiff identity}) |
230 | | - :cljs (extend-type js/Number Undiff |
231 | | - (left-undiff [m] (identity m)) |
232 | | - (right-undiff [m] (identity m)))) |
| 240 | +#?(:clj (extend Object Undiff {:-left-undiff identity :-right-undiff identity})) |
0 commit comments