summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2009-08-20 12:47:09 -0400
committerRich Hickey <richhickey@gmail.com>2009-08-20 12:47:09 -0400
commit5cddaf84b648657237bc1b5d81d65a5072e9c3be (patch)
treeede6e3c842ae1f7f74b643e49395e1aedef47900
parent7ba336f50f32dbe9ce06ef00d1482e67341dbdb6 (diff)
fix interleave not fully lazy
-rw-r--r--src/clj/clojure/core.clj16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj
index 4096a6ff..ef8b40e2 100644
--- a/src/clj/clojure/core.clj
+++ b/src/clj/clojure/core.clj
@@ -2588,10 +2588,18 @@
(cons (first s) (take-nth n (drop n s))))))
(defn interleave
- "Returns a lazy seq of the first item in each coll, then the second
- etc."
- [& colls]
- (apply concat (apply map list colls)))
+ "Returns a lazy seq of the first item in each coll, then the second etc."
+ ([c1 c2]
+ (lazy-seq
+ (let [s1 (seq c1) s2 (seq c2)]
+ (when (and s1 s2)
+ (cons (first s1) (cons (first s2)
+ (interleave (rest s1) (rest s2))))))))
+ ([c1 c2 & colls]
+ (lazy-seq
+ (let [ss (map seq (conj colls c2 c1))]
+ (when (every? identity ss)
+ (concat (map first ss) (apply interleave (map rest ss))))))))
(defn var-get
"Gets the value in the var object"