aboutsummaryrefslogtreecommitdiff
path: root/src/clojure/contrib/monads.clj
diff options
context:
space:
mode:
authorKonrad Hinsen <konrad.hinsen@laposte.net>2009-02-27 13:41:49 +0000
committerKonrad Hinsen <konrad.hinsen@laposte.net>2009-02-27 13:41:49 +0000
commit535f4ceac5f41f873250093174a0ccdfe8a7c057 (patch)
tree41b7e34059fd3fb4a7714b0b990fe9e8ef09384e /src/clojure/contrib/monads.clj
parentf47197d0b901b6cd1756212df262e0bb0b70605e (diff)
monads: added state-t monad transformer (by Jim Duey)
Diffstat (limited to 'src/clojure/contrib/monads.clj')
-rw-r--r--src/clojure/contrib/monads.clj30
1 files changed, 29 insertions, 1 deletions
diff --git a/src/clojure/contrib/monads.clj b/src/clojure/contrib/monads.clj
index 838a4221..b923d026 100644
--- a/src/clojure/contrib/monads.clj
+++ b/src/clojure/contrib/monads.clj
@@ -1,7 +1,7 @@
;; Monads in Clojure
;; by Konrad Hinsen
-;; last updated February 18, 2009
+;; last updated February 25, 2009
;; Copyright (c) Konrad Hinsen, 2009. All rights reserved. The use
;; and distribution terms for this software are covered by the Eclipse
@@ -384,3 +384,31 @@
(fn [xs]
(apply concat (map f xs))))))
]))
+
+;; Contributed by Jim Duey
+(defn state-t
+ "Monad transformer that transforms a monad m into a monad of stateful
+ computations that have the base monad type as their result."
+ [m]
+ (monad [m-result (with-monad m
+ (fn m-result-state-t [v]
+ (fn [s]
+ (m-result (list v s)))))
+ m-bind (with-monad m
+ (fn m-bind-state-t [stm f]
+ (fn [s]
+ (m-bind (stm s)
+ (fn [[v ss]]
+ ((f v) ss))))))
+ m-zero (with-monad m
+ (if (= ::undefined m-zero)
+ ::undefined
+ (fn [s]
+ m-zero)))
+ m-plus (with-monad m
+ (if (= ::undefined m-plus)
+ ::undefined
+ (fn [& stms]
+ (fn [s]
+ (apply m-plus (map #(% s) stms))))))
+ ]))