diff options
author | Konrad Hinsen <konrad.hinsen@laposte.net> | 2009-02-23 17:40:53 +0000 |
---|---|---|
committer | Konrad Hinsen <konrad.hinsen@laposte.net> | 2009-02-23 17:40:53 +0000 |
commit | 4e6c3a8c9abce25c0f8a601e130b379382267c90 (patch) | |
tree | 6c5c9b3a17447613e3fb8ceda9986eade34ced34 /src/clojure/contrib/stream_utils | |
parent | cbf439ccf0e8e7d5533862a5c2d41cdf66f719d5 (diff) |
stream-utils: almost completely new content
Diffstat (limited to 'src/clojure/contrib/stream_utils')
-rw-r--r-- | src/clojure/contrib/stream_utils/examples.clj | 79 |
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))) |