aboutsummaryrefslogtreecommitdiff
path: root/src/clojure/contrib/monads.clj
diff options
context:
space:
mode:
authorKonrad Hinsen <konrad.hinsen@laposte.net>2009-04-29 13:25:07 +0000
committerKonrad Hinsen <konrad.hinsen@laposte.net>2009-04-29 13:25:07 +0000
commited76d5f261ca52355b8a16bfe70700ba90d48970 (patch)
treeb6ec3285035645bc3304b4721e84a0cd114f7fdc /src/clojure/contrib/monads.clj
parent249af9e8605bc1aa67aaa5d191f6168f900cf5cd (diff)
monads: sequence monad made fully lazy
Diffstat (limited to 'src/clojure/contrib/monads.clj')
-rw-r--r--src/clojure/contrib/monads.clj22
1 files changed, 18 insertions, 4 deletions
diff --git a/src/clojure/contrib/monads.clj b/src/clojure/contrib/monads.clj
index 8a1f2499..91d72ab3 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 April 28, 2009
+;; last updated April 29, 2009
;; Copyright (c) Konrad Hinsen, 2009. All rights reserved. The use
;; and distribution terms for this software are covered by the Eclipse
@@ -234,6 +234,20 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
+;; Utility functions used in monad definitions
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defn- flatten
+ "Like #(apply concat %), but fully lazy: it evaluates each sublist
+ only when it is needed."
+ [ss]
+ (lazy-seq
+ (when-let [s (seq ss)]
+ (concat (first s) (flatten (rest s))))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
;; Commonly used monads
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -269,10 +283,10 @@
[m-result (fn m-result-sequence [v]
(list v))
m-bind (fn m-bind-sequence [mv f]
- (apply concat (map f mv)))
+ (flatten (map f mv)))
m-zero (list)
m-plus (fn m-plus-sequence [& mvs]
- (apply concat mvs))
+ (flatten mvs))
])
; Set monad
@@ -470,7 +484,7 @@
(fn m-bind-sequence-t [mv f]
(m-bind mv
(fn [xs]
- (m-fmap #(apply concat %)
+ (m-fmap flatten
(m-map f xs))))))
m-zero (with-monad m (m-result (list)))
m-plus (with-monad m