On Thu, Sep 16, 2010 at 10:45 PM, Chouser <chou...@gmail.com> wrote: > On Fri, Sep 10, 2010 at 4:26 PM, Matt Smith <m0sm...@gmail.com> wrote: > > problem: convert a collection [1 2 0 1 2 3 0 1 2 3 0 0 1 2] into > > partitions like: > > ((1 2) (0 1 2 3) (0 1 2 3) (0) (0 1 2)) > > In this case, start each partition on a 0. > > Iteration at a rate other than once per input seq item suggests iterate: > > (defn partition-starting-every [f coll] > (->> [nil coll] > (iterate (fn [[p [x :as s1]]] > (let [[n s2] (split-with (complement f) (next s1))] > (when (seq s1) > [(cons x n) s2])))) > (map first) > next > (take-while identity))) > > Ugh. Well, maybe partition-by can be used after all: > > (defn partition-starting-every [f coll] > (let [pb (partition-by #(and (f %) (Object.)) coll)] > (->> (map (fn [[a :as as] [b :as bs]] > (cond > (nil? as) (when-not (f b) bs) > (and (f a) (f b)) as > (f a) (concat as bs))) > (cons nil pb) pb) > (remove nil?)))) > > Nice trick that your #(and (f %) (Object.)) however #(when (f %) (Object.)) would be better because it would produce only one false value (nil) instead of two (nil and false).
For comprehensiveness, let's not forget reductions :-) (defn partition-starting-every "Partition the sequence starting each partition when the f is true." [f coll] (map #(map first %) (partition-by second (map vector coll (rest (reductions #(if (f %2) (inc %1) %1) 0 coll)))))) Christophe -- Professional: http://cgrand.net/ (fr) On Clojure: http://clj-me.cgrand.net/ (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