aboutsummaryrefslogtreecommitdiff
path: root/src/clojure/contrib/stream_utils
diff options
context:
space:
mode:
authorKonrad Hinsen <konrad.hinsen@laposte.net>2009-02-23 17:40:53 +0000
committerKonrad Hinsen <konrad.hinsen@laposte.net>2009-02-23 17:40:53 +0000
commit4e6c3a8c9abce25c0f8a601e130b379382267c90 (patch)
tree6c5c9b3a17447613e3fb8ceda9986eade34ced34 /src/clojure/contrib/stream_utils
parentcbf439ccf0e8e7d5533862a5c2d41cdf66f719d5 (diff)
stream-utils: almost completely new content
Diffstat (limited to 'src/clojure/contrib/stream_utils')
-rw-r--r--src/clojure/contrib/stream_utils/examples.clj79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/clojure/contrib/stream_utils/examples.clj b/src/clojure/contrib/stream_utils/examples.clj
new file mode 100644
index 00000000..0d0454a7
--- /dev/null
+++ b/src/clojure/contrib/stream_utils/examples.clj
@@ -0,0 +1,79 @@
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Stream application examples
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(use 'clojure.contrib.stream-utils)
+(use 'clojure.contrib.monads)
+
+; Transform a stream of numbers into a stream of sums of
+; two consecutive numbers.
+(defst-seq sum-two [] [xs]
+ (domonad
+ [x1 (pick xs)
+ x2 (pick xs)]
+ (+ x1 x2)))
+
+(sum-two '(1 2 3 4 5 6 7 8))
+
+; The same example, but with a generator interface for the output stream
+(defst-gen sum-two-gen [] [xs]
+ (domonad
+ [x1 (pick xs)
+ x2 (pick xs)]
+ (+ x1 x2)))
+
+(def g (sum-two-gen '(1 2 3 4 5 6 7 8)))
+(let [[v1 g] (g :eos)]
+ (let [[v2 g] (g :eos)]
+ (let [[v3 g] (g :eos)]
+ (let [[v4 g] (g :eos)]
+ (let [[v5 g] (g :eos)]
+ [v1 v2 v3 v4 v5])))))
+
+; Map (for a single stream) written as a stream transformer
+(defst-seq my-map-1 [f] [xs]
+ (domonad
+ [x (pick xs)]
+ (f x)))
+
+(my-map-1 inc [1 2 3])
+
+; Map for two stream arguments
+(defst-seq my-map-2 [f] [xs ys]
+ (domonad
+ [x (pick xs)
+ y (pick ys)]
+ (f x y)))
+
+(my-map-2 + '(1 2 3 4) '(10 20 30 40))
+
+; Map for any number of stream arguments
+(defst-seq my-map [f] [& streams]
+ (domonad
+ [vs pick-all]
+ (apply f vs)))
+
+(my-map inc [1 2 3])
+(my-map + '(1 2 3 4) '(10 20 30 40))
+
+; Filter written as a stream transformer
+(defst-seq my-filter [p] [xs]
+ (domonad
+ [x (pick xs) :when (p x)]
+ x))
+
+(my-filter odd? [1 2 3])
+
+; A simple random number generator, implemented as a generator function
+(defn rng [seed]
+ (fn [eos]
+ (let [m 259200
+ value (/ (float seed) (float m))
+ next (rem (+ 54773 (* 7141 seed)) m)]
+ [value (rng next)])))
+
+(take 10 (stream-as-seq (rng 1)))