Could do it this way. Use index-filter (borrowed from Programming
Clojure) to get the indices where the predicate is true in the
sequence. partition-when-true then just calls subvec with pairs of
indices to get the subsequences.
coll-end is the index just past the end of the collection. This is
used as a pad element so that the last true index is included in the
pairs, and also accounts for the case where there is only a single
true index.
(use '[clojure.contrib.seq :only (indexed)])
(defn index-filter [pred coll]
(when pred
(for [[idx elt] (indexed coll) :when (pred elt)] idx)))
(defn partition-when [pred coll]
(let [coll-end (count coll)
indices (index-filter pred coll)
index-pairs (partition 2 1 [coll-end] indices)
coll-vec (vec coll)]
(for [[start end] index-pairs] (subvec coll-vec start end))))
user=> (partition-when true? '(true false false true false true true))
([true false false] [true false] [true] [true])
On Nov 27, 10:02 am, Asim Jalis <[email protected]> wrote:
> I want to partition a sequence based on the values of a predicate so
> that every true starts a new sequence in the partition. Here is an
> example of how partition-with could be used:
>
> (partition-when true? '(true false false true false true true))
> -> '((true false false) (true false) (true) (true))
>
> I have written this lazy-seq and recursion. However, I was wondering
> if there is a way to do this with core Clojure sequence primitives.
> Any suggestions?
>
> Asim
> --
> San Francisco, CA
--
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