function | since v0.0-927 | clojure.core/juxt | Edit |
(juxt f)
(juxt f g)
(juxt f g h)
(juxt f g h & fs)
Takes a set of functions and returns a function that is the juxtaposition of those functions.
The returned function takes a variable number of arguments, and returns a vector containing the result of applying each function to the arguments (left-to- right).
((juxt a b c) x)
=> [(a x) (b x) (c x)]
Takes a set of functions and returns a fn that is the juxtaposition of those fns. The returned fn takes a variable number of args, and returns a vector containing the result of applying each fn to the args (left-to-right). ((juxt a b c) x) => [(a x) (b x) (c x)]
(defn juxt
([f]
(fn
([] (vector (f)))
([x] (vector (f x)))
([x y] (vector (f x y)))
([x y z] (vector (f x y z)))
([x y z & args] (vector (apply f x y z args)))))
([f g]
(fn
([] (vector (f) (g)))
([x] (vector (f x) (g x)))
([x y] (vector (f x y) (g x y)))
([x y z] (vector (f x y z) (g x y z)))
([x y z & args] (vector (apply f x y z args) (apply g x y z args)))))
([f g h]
(fn
([] (vector (f) (g) (h)))
([x] (vector (f x) (g x) (h x)))
([x y] (vector (f x y) (g x y) (h x y)))
([x y z] (vector (f x y z) (g x y z) (h x y z)))
([x y z & args] (vector (apply f x y z args) (apply g x y z args) (apply h x y z args)))))
([f g h & fs]
(let [fs (list* f g h fs)]
(fn
([] (reduce #(conj %1 (%2)) [] fs))
([x] (reduce #(conj %1 (%2 x)) [] fs))
([x y] (reduce #(conj %1 (%2 x y)) [] fs))
([x y z] (reduce #(conj %1 (%2 x y z)) [] fs))
([x y z & args] (reduce #(conj %1 (apply %2 x y z args)) [] fs))))))