I've opened JIRA CLJ-1011.

On Sunday, June 10, 2012 1:16:55 PM UTC+1, Philip Aston wrote:
>
> Current behaviour of clojure.data/diff:
>
> => (diff {:a false} {:a true})
> (nil {:a true} nil)
> => (diff {:a false} {:a nil})
> (nil nil nil)
>
> With patch:
>
> => (diff {:a false} {:a true})
> ({:a false} {:a true} nil)
> => (diff {:a false} {:a nil})
> ({:a false} {:a nil} nil)
>
>
> This seems more consistent and useful to me, but I may be missing 
> something.
>
> Should I open a JIRA?
>
> - Phil
>
>
> -------
>
> From e03a8060214d122ea2ebadf9e8a368f7f593d9f4 Mon Sep 17 00:00:00 2001
> From: Philip Aston <phil...@mail.com>
> Date: Sun, 10 Jun 2012 13:11:36 +0100
> Subject: [PATCH] clojure.data/diff: cope with falsey values in maps
>
> ---
>  src/clj/clojure/data.clj           |   18 +++++++++++++++++-
>  test/clojure/test_clojure/data.clj |    3 ++-
>  2 files changed, 19 insertions(+), 2 deletions(-)
>
> diff --git a/src/clj/clojure/data.clj b/src/clj/clojure/data.clj
> index 6e8dbcf..345b234 100644
> --- a/src/clj/clojure/data.clj
> +++ b/src/clj/clojure/data.clj
> @@ -30,6 +30,22 @@
>       (vec (repeat (apply max (keys m))  nil))
>       m)))
>  
> +(defn- diff-associative-key
> +  "Diff associative things a and b, comparing only the key k."
> +  [a b k]
> +  (let [va (get a k)
> +        vb (get b k)
> +        [a* b* ab] (diff va vb)
> +        in-a (contains? a k)
> +        in-b (contains? b k)
> +        same (and in-a in-b
> +                  (or (not (nil? ab))
> +                      (and (nil? va) (nil? vb))))]
> +    [(when (and in-a (or (not (nil? a*)) (not same))) {k a*})
> +     (when (and in-b (or (not (nil? b*)) (not same))) {k b*})
> +     (when same {k ab})
> +     ]))
> +
>  (defn- diff-associative
>    "Diff associative things a and b, comparing only keys in ks."
>    [a b ks]
> @@ -38,7 +54,7 @@
>       (doall (map merge diff1 diff2)))
>     [nil nil nil]
>     (map
> -    (fn [k] (map #(when % {k %}) (diff (get a k) (get b k))))
> +    (partial diff-associative-key a b)
>      ks)))
>  
>  (defn- diff-sequential
> diff --git a/test/clojure/test_clojure/data.clj 
> b/test/clojure/test_clojure/data.clj
> index 9bab766..5a241e0 100644
> --- a/test/clojure/test_clojure/data.clj
> +++ b/test/clojure/test_clojure/data.clj
> @@ -27,5 +27,6 @@
>         [#{1} #{3} #{2}] (HashSet. [1 2]) (HashSet. [2 3])
>         [nil nil [1 2]] [1 2] (into-array [1 2])
>         [nil nil [1 2]] (into-array [1 2]) [1 2]
> -       [{:a {:c [1]}} {:a {:c [0]}} {:a {:c [nil 2] :b 1}}] {:a {:b 1 :c 
> [1 2]}} {:a {:b 1 :c [0 2]}}))
> +       [{:a {:c [1]}} {:a {:c [0]}} {:a {:c [nil 2] :b 1}}] {:a {:b 1 :c 
> [1 2]}} {:a {:b 1 :c [0 2]}}
> +       [{:a nil} {:a false} {:b nil :c false}] {:a nil :b nil :c false} 
> {:a false :b nil :c false}))
>  
> -- 
> 1.7.9.5
>
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to