Tried myself and my first transducer for fun: (defn partition-when [f] (fn [rf] (let [a (java.util.ArrayList.) fval (volatile! false)] (fn ([] (rf)) ([result] (let [result (if (.isEmpty a) result (let [v (vec (.toArray a))] ;;clear first! (.clear a) (unreduced (rf result v))))] (rf result))) ([result input] (if-not (and (f input) @fval) (do (vreset! fval true) (.add a input) result) (let [v (vec (.toArray a))] (.clear a) (let [ret (rf result v)] (when-not (reduced? ret) (.add a input)) ret))))))))
(into [] (partition-when #(.startsWith % ">>")) [">> 1" ">> 2" "22" ">> 3"]) Based on partition-by (on master branch). Would be interesting how fast it is compared to the other implementations. Any comments appreciated. Cheers On Tuesday, March 3, 2015 at 2:46:29 PM UTC-5, Frank wrote: > > Hi all, > > for some tests I need a function which starts a new partition each time a > predicate returns true, for instance: > > (partition-when > (fn [s] (.startsWith s ">>")) > [">> 1" "2" "3" ">> 4" "5" "6"]) > :=> [[">> 1" "2" "3"] [">> 4" "5" "6"]] > > Since I haven't found a built-in function, I copied, pasted, and modified > the core function partition-by: > > (defn partition-when > [f coll] > (lazy-seq > (when-let [s (seq coll)] > (let [fst (first s) > run (cons fst (take-while #(not (f %)) (next s)))] > (cons run (partition-when f (seq (drop (count run) s)))))))) > > Is there a better (more idiomatic) way to achieve the same result? > > Thank you in advance. > > Frank > -- 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 --- 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 clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.