Here is partition-before and partition-after -- partition-after is simpler.

(defn partition-before-internal [pred coll]
  (let [first-item (first coll)]
   (if (nil? first-item) ()
     (letfn [(get-partial-partition-with-item []
               (let [partial-partition (partition-before-internal pred
(rest coll))]
                 (cons
                   (cons
                     first-item
                     (first partial-partition))
                   (rest partial-partition))))]
       (if (pred first-item)
         (cons () (lazy-seq (get-partial-partition-with-item)))
         (get-partial-partition-with-item))))))

(defn partition-before [pred coll]
  (lazy-seq
    (let [partition-result (partition-before-internal pred coll)]
      (if (empty? (first partition-result))
        (rest partition-result)
        partition-result))))

(deftest partitioning-before
  (are [input output] (= ',output (partition-before true? ',input))
    ()        ()
    (true)    ((true))
    (false)   ((false))
    (false false false true false true true true)
      ((false false false) (true false) (true) (true) (true))
    (true false false false true false true true true)
      ((true false false false) (true false) (true) (true) (true))))

(defn partition-after [pred coll]
  (lazy-seq
    (let [first-item (first coll)]
     (if (nil? first-item) ()
       (let [partial-partition (lazy-seq (partition-after pred (rest coll)))]
         (if (pred first-item)
           (cons (list first-item) partial-partition)
           (cons
             (cons
               first-item
               (first partial-partition))
             (rest partial-partition))))))))

(deftest partitioning-after
  (are [input output] (= ',output (partition-after true? ',input))
    ()        ()
    (true)    ((true))
    (false)   ((false))
    (false false false true false true true true)
      ((false false false true) (false true) (true) (true))
    (true false false false true false true true true)
      ((true) (false false false true) (false true) (true) (true))))

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