aboutsummaryrefslogtreecommitdiff
path: root/src/clojure/contrib/generic/functor.clj
diff options
context:
space:
mode:
authorKonrad Hinsen <konrad.hinsen@laposte.net>2009-03-18 09:16:30 +0000
committerKonrad Hinsen <konrad.hinsen@laposte.net>2009-03-18 09:16:30 +0000
commit334ad56890518ddd27c1327a25c91f8db873e417 (patch)
treea38f17f40b553de7ffc608928c7a9b2f5203b1b8 /src/clojure/contrib/generic/functor.clj
parent832224974863b538b509715607c24a38a236554f (diff)
generic: new module functor
Diffstat (limited to 'src/clojure/contrib/generic/functor.clj')
-rw-r--r--src/clojure/contrib/generic/functor.clj38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/clojure/contrib/generic/functor.clj b/src/clojure/contrib/generic/functor.clj
new file mode 100644
index 00000000..1198c510
--- /dev/null
+++ b/src/clojure/contrib/generic/functor.clj
@@ -0,0 +1,38 @@
+;; Generic interface for functors
+
+;; by Konrad Hinsen
+;; last updated March 18, 2009
+
+;; Copyright (c) Konrad Hinsen, 2009. All rights reserved. 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 clojure.contrib.generic.functor
+ "Generic functor interface")
+
+
+(defmulti fmap
+ "Applies function f to each item in the data structure s and returns
+ a structure of the same kind."
+ {:arglists '([f s])}
+ (fn [f s] (type s)))
+
+(defmethod fmap clojure.lang.ISeq
+ [f s]
+ (map f s))
+
+(defmethod fmap clojure.lang.IPersistentVector
+ [f v]
+ (into (empty v) (map f v)))
+
+(defmethod fmap clojure.lang.IPersistentMap
+ [f m]
+ (into (empty m) (for [[k v] m] [k (f v)])))
+
+(defmethod fmap clojure.lang.IPersistentSet
+ [f s]
+ (into (empty s) (map f s)))