On Sat, Nov 27, 2010 at 11:03 PM, Benny Tsai <benny.t...@gmail.com> wrote:
> 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))))

While (distinct foo) is technically lazy, it retains in a set in
memory every distinct element seen so far, and with the indices here
that's as bad as holding onto the head. And all to avoid a 0 being
repeated at the start. Try:

(defn add-zero [coll]
  (if (= 0 (first coll)) coll (cons 0 coll)))

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

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