That's what I get for coding without taking my afternoon nap :)

Try 3.  Tweaked 'subsequence' and 'split-when' so that it is no longer
necessary to calculate the index for the end of the collection.  Also
added a check to 'split-when' to return an empty list when called on
an empty collection; otherwise it would return (()), which seemed like
a strange result.

(use '[clojure.contrib.seq :only (indexed)])

(defn index-filter [pred coll]
  (when pred
    (for [[idx elt] (indexed coll) :when (pred elt)] idx)))

(defn subsequence
  ([coll start]
     (drop start coll))
  ([coll start end]
     (take (- end start) (drop start coll))))

(defn split-when [pred coll]
  (if (empty? coll)
    '()
    (let [indices (distinct (conj (index-filter pred coll) 0))
          index-groups (partition-all 2 1 indices)]
      (map #(apply subsequence coll %) index-groups))))

On Nov 27, 7:26 pm, Ken Wesson <kwess...@gmail.com> wrote:
> On Sat, Nov 27, 2010 at 8:35 PM, Benny Tsai <benny.t...@gmail.com> wrote:
> > Here's a fixed version that...
>
> > 1. Is lazy everywhere.
> > 2. No longer loses elements :)
>
> ...
>
> > (defn split-when [pred coll]
> >  (let [coll-end (count coll)
>
> Er, did you just say "is lazy everywhere"? :)

-- 
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

Reply via email to