diff options
author | Rich Hickey <richhickey@gmail.com> | 2009-08-20 12:47:09 -0400 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2009-08-20 12:47:09 -0400 |
commit | 5cddaf84b648657237bc1b5d81d65a5072e9c3be (patch) | |
tree | ede6e3c842ae1f7f74b643e49395e1aedef47900 | |
parent | 7ba336f50f32dbe9ce06ef00d1482e67341dbdb6 (diff) |
fix interleave not fully lazy
-rw-r--r-- | src/clj/clojure/core.clj | 16 |
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" |