The implementation I posted earlier appears to fit the contract of
your partition-before (and, additionally, works properly if the input
starts with (nil ...) :)).
There is another possible variation: partition-dropping. Here the
elements for which pred returns true don't get included in the output
at all; e.g. (partition-dropping #(= 0 (rem % 3)) (range 16)) would
emit ((1 2) (4 5) (7 8) (10 11) (13 14) (16)). The use case for this
is when the pred is testing for a separator sentinel value, an object
in the sequence that you're not actually interested in for any purpose
other than its use as a separator. For instance if you had a text file
of blank-line-delimited paragraphs and wanted a paragraph-seq out of
it, you might use (partition-dropping #(= "" %) (line-seq ...)). Or a
more sophisticated predicate that recognizes all lines with no
nonwhitespace characters as blank:
(defn blank? [s]
(every? #(Character/isWhitespace %) s))
(partition-dropping blank? (line-seq ...))
And here's an implementation:
(defn partition-dropping [pred coll]
(let [ipred (complement pred)
bits (iterate
(fn [[out coll]]
(let [[a b] (split-with ipred (rest coll))
x (first coll)]
(if (and (seq coll) (pred x))
[a b]
[(cons x a) b])))
[nil coll])]
(map #(first (first %))
(take-while #(seq (second (second %))) (map vector (rest bits) bits)))))
user=> (partition-dropping #(= 0 (rem % 4)) (range 15))
((1 2 3)
(5 6 7)
(9 10 11)
(13 14))
user=> (take 5 (partition-dropping #(= 0 (rem % 4)) (iterate inc 1)))
((1 2 3)
(5 6 7)
(9 10 11)
(13 14 15)
(17 18 19))
It handles nils properly:
user=> (partition-dropping identity [nil nil nil true 'x false 1 2
true nil 17 false 4 8 15 16 23 42])
((nil nil nil)
()
(false)
()
()
(nil)
(false)
()
()
()
()
()
())
user=> (partition-dropping (complement identity) [nil nil nil true 'x
false 1 2 true nil 17 false 4 8 15 16 23 42])
(()
()
(true x)
(1 2 true)
(17)
(4 8 15 16 23 42))
though you'll note that empty lists appear whenever pred is true for
two adjacent items. If you want to get rid of those:
user=> (remove empty? (partition-dropping (complement identity) [nil
nil nil true 'x false 1 2 true nil 17 false 4 8 15 16 23 42]))
((true x)
(1 2 true)
(17)
(4 8 15 16 23 42))
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en