monger.fn can go now since we rely on ClojureWerkz Support
This commit is contained in:
parent
c6ef174535
commit
b1e874aa87
2 changed files with 0 additions and 118 deletions
|
|
@ -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))
|
||||
|
|
@ -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" })))
|
||||
Loading…
Reference in a new issue