diff --git a/src/clojure/monger/internal/fn.clj b/src/clojure/monger/internal/fn.clj deleted file mode 100644 index 8860738..0000000 --- a/src/clojure/monger/internal/fn.clj +++ /dev/null @@ -1,73 +0,0 @@ -;; Copyright (c) 2011-2014 Michael S. Klishin -;; -;; The use and distribution terms for this software are covered by the -;; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) -;; which can be found in the file epl-v10.html at the root of this distribution. -;; By using this software in any fashion, you are agreeing to be bound by -;; the terms of this license. -;; You must not remove this notice, or any other, from this software. - -(ns monger.internal.fn) - - -;; -;; Implementation -;; - -(defn- apply-to-values [m f] - "Applies function f to all values in map m" - (into {} (for [[k v] m] - [k (f v)]))) - -;; -;; API -;; - -(defn fpartial - "Like clojure.core/partial but prepopulates last N arguments (first is passed in later)" - [f & args] - (fn [arg & more] (apply f arg (concat args more)))) - -(defprotocol IFNExpansion - (expand-all [x] "Replaces functions with their invocation results, recursively expands maps, evaluates all other values to themselves") - (expand-all-with [x f] "Replaces functions with their invocation results that function f is applied to, recursively expands maps, evaluates all other values to themselves")) - -(extend-protocol IFNExpansion - java.lang.Integer - (expand-all [i] i) - (expand-all-with [i f] i) - - java.lang.Long - (expand-all [l] l) - (expand-all-with [l f] l) - - java.lang.String - (expand-all [s] s) - (expand-all-with [s f] s) - - java.lang.Float - (expand-all [fl] fl) - (expand-all-with [fl f] fl) - - java.lang.Double - (expand-all [d] d) - (expand-all-with [d f] d) - - ;; maps are also functions, so be careful here. MK. - clojure.lang.IPersistentMap - (expand-all [m] (apply-to-values m expand-all)) - (expand-all-with [m f] (apply-to-values m (fpartial expand-all-with f))) - - clojure.lang.PersistentVector - (expand-all [v] (map expand-all v)) - (expand-all-with [v f] (map (fpartial expand-all-with f) v)) - - ;; this distinguishes functions from maps, sets and so on, which are also - ;; clojure.lang.AFn subclasses. MK. - clojure.lang.AFunction - (expand-all [f] (f)) - (expand-all-with [f expander] (expander f)) - - Object - (expand-all [x] x) - (expand-all-with [x f] x)) diff --git a/test/monger/test/internal/fn_test.clj b/test/monger/test/internal/fn_test.clj deleted file mode 100644 index 49bd833..0000000 --- a/test/monger/test/internal/fn_test.clj +++ /dev/null @@ -1,45 +0,0 @@ -(ns monger.test.internal.fn-test - (:require [clojure.test :refer :all] - [monger.internal.fn :refer :all])) - - -(deftest test-expand-all - (are [i o] (is (= (expand-all i) o)) - { :int (fn [] 1) :str "Clojure" :float (Float/valueOf 11.0) } { :int 1 :str "Clojure" :float (Float/valueOf 11.0 )} - { :long (fn [] (Long/valueOf 11)) } { :long (Long/valueOf 11) } - { - :i 1 - :l (Long/valueOf 1111) - :s "Clojure" - :d (Double/valueOf 11.1) - :f (Float/valueOf 2.5) - :v [1 2 3] - :dyn-v [(fn [] 10) (fn [] 20) (fn [] 30)] - :dyn-i (fn [] 1) - :dyn-s (fn [] "Clojure (expanded)") - :m { :nested "String" } - :dyn-m { :abc (fn [] :abc) :nested { :a { :b { :c (fn [] "d") } } } } - } - { - :i 1 - :l (Long/valueOf 1111) - :s "Clojure" - :d (Double/valueOf 11.1) - :f (Float/valueOf 2.5) - :v [1 2 3] - :dyn-v [10 20 30] - :dyn-i 1 - :dyn-s "Clojure (expanded)" - :m { :nested "String" } - :dyn-m { - :abc :abc - :nested { :a { :b { :c "d" } } } - } - })) - -(deftest test-expand-all-with - (let [expander-fn (fn [f] - (* 3 (f)))] - (are [i o] (is (= (expand-all-with i expander-fn) o)) - { :a 1 :int (fn [] 3) } { :a 1 :int 9 } - { :v [(fn [] 1) (fn [] 11)] :m { :inner (fn [] 3) } :s "Clojure" } { :v [3 33] :m { :inner 9 } :s "Clojure" })))