diff options
author | Konrad Hinsen <konrad.hinsen@laposte.net> | 2009-04-29 13:25:07 +0000 |
---|---|---|
committer | Konrad Hinsen <konrad.hinsen@laposte.net> | 2009-04-29 13:25:07 +0000 |
commit | ed76d5f261ca52355b8a16bfe70700ba90d48970 (patch) | |
tree | b6ec3285035645bc3304b4721e84a0cd114f7fdc /src/clojure/contrib/monads.clj | |
parent | 249af9e8605bc1aa67aaa5d191f6168f900cf5cd (diff) |
monads: sequence monad made fully lazy
Diffstat (limited to 'src/clojure/contrib/monads.clj')
-rw-r--r-- | src/clojure/contrib/monads.clj | 22 |
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 |