Something like this? (defn partition-when [f l] (reduce #(if (f %2) (conj %1 (vector %2)) (conj (butlast %1) (conj (last %1) %2))) [] l))
On Sat, Nov 27, 2010 at 4:15 PM, Ken Wesson <kwess...@gmail.com> wrote: > On Sat, Nov 27, 2010 at 4:00 PM, rob levy <r.p.l...@gmail.com> wrote: > > partition-by does exactly what you need. > > Not quite. > > user=> (take 10 (partition-by #(= 0 (rem % 3)) (iterate inc 1))) > ((1 2) > (3) > (4 5) > (6) > (7 8) > (9) > (10 11) > (12) > (13 14) > (15)) > > At first it seems you can fix this as follows: > > user=> (defn questionable-split-when [pred coll] > (let [p (partition-by pred coll)] > (cons (first p) (map #(apply concat %) (partition 2 2 [] > (rest p)))))) > #'user/questionable-split-when > user=> (take 10 (questionable-split-when #(= 0 (rem % 3)) (iterate inc 1))) > ((1 2) > (3 4 5) > (6 7 8) > (9 10 11) > (12 13 14) > (15 16 17) > (18 19 20) > (21 22 23) > (24 25 26) > (27 28 29)) > > So far, so good. But: > > user=> (questionable-split-when #(= 0 (rem % 3)) [1 2 3 6 7 8 9]) > ((1 2) > (3 6 7 8) > (9)) > > Whereas: > > user=> (split-when #(= 0 (rem % 3)) [1 2 3 6 7 8 9]) > ((1 2) > (3) > (6 7 8) > (9)) > > The latter correctly starts a new partition each time the pred is > true; the former fails if the pred is ever true twice in a row. > > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with > your first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com<clojure%2bunsubscr...@googlegroups.com> > 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 post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en