This looks like a standard thing you might want to do with a transducer:
accept a stream of inputs and statefully group them into a stream of
varying-length vectors. A typical example might be to accept a series of
bowling throws and emit them grouped into bowling frames. So you have a
generic "vectorTransducer" which is defined by the rule as to when one
frame is full and the next begins. Does such a thing have a standard name?
Thanks!
Marshall
(defn vectorTransducer [timeForNextVector]
(fn [rf]
(let [pending (volatile! [])]
(fn
([] (rf))
([result] (if (not-empty @pending)
(rf result @pending)
(rf result)))
([result input]
(let [appended (conj @pending input)]
(if (timeForNextVector appended)
(do (vreset! pending [])
(rf result appended))
(do (vreset! pending appended)
result))))))))
(defn bowlingTransducer[]
(vectorTransducer
(fn ([v]
(or (<= 2 (count v))
(<= 10 (reduce + v)))))))
(into [] (bowlingTransducer)
(concat (range 11) (range 11)))
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.