diff --git a/src/net/cgrand/xforms.cljc b/src/net/cgrand/xforms.cljc index 3740693..12a2f59 100644 --- a/src/net/cgrand/xforms.cljc +++ b/src/net/cgrand/xforms.cljc @@ -28,8 +28,10 @@ (unreduced-> (-> x# ~expr) ~@exprs))))) (defn- pair? [x] (and (vector? x) (= 2 (core/count x)))) -(defn- destructuring-pair? [x] - (and (pair? x) (not (or (keyword? x) (= '& x))))) +(let [kw-or-& #(or (keyword? %) (= '& %))] + (defn- destructuring-pair? [x] + (and (pair? x) + (not (kw-or-& (first x)))))) (defmacro for "Like clojure.core/for with the first expression being replaced by % (or _). Returns a transducer. diff --git a/test/net/cgrand/xforms_test.cljc b/test/net/cgrand/xforms_test.cljc index d3b0466..7840ce4 100644 --- a/test/net/cgrand/xforms_test.cljc +++ b/test/net/cgrand/xforms_test.cljc @@ -1,5 +1,5 @@ (ns net.cgrand.xforms-test - (:require [clojure.test :refer [is deftest testing]] + (:require [clojure.test :refer [are is deftest testing]] [net.cgrand.xforms :as x])) (defn trial @@ -139,4 +139,17 @@ (is (= (range 100) (x/into [] (x/sort) (shuffle (range 100))))) (is (= (reverse (range 100)) (x/into [] (x/sort >) (shuffle (range 100))))) (is (= (sort-by str (range 100)) (x/into [] (x/sort-by str) (shuffle (range 100))))) - (is (= (sort-by str (comp - compare) (range 100)) (x/into [] (x/sort-by str (comp - compare)) (shuffle (range 100)))))) \ No newline at end of file + (is (= (sort-by str (comp - compare) (range 100)) (x/into [] (x/sort-by str (comp - compare)) (shuffle (range 100)))))) + +(deftest destructuring-pair? + (let [destructuring-pair? #'x/destructuring-pair?] + (are [candidate expected] + (= expected (destructuring-pair? candidate)) + '[a b] true + '[a b c] false + '[& foo] false + '[:as foo] false + 1 false + '(a b) false + '{foo bar} false + '{foo :bar} false)))