summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2009-06-20 12:56:29 -0400
committerRich Hickey <richhickey@gmail.com>2009-06-20 12:56:29 -0400
commit73059ebdbfebb361eff01079eccfd4591ab82055 (patch)
tree0bd38ecc60c7bb9d9dd169e9261d317ee5d48af8
parent2a5fa05b05c880a1f08110edaabf644b8a39e6ea (diff)
made range chunked
-rw-r--r--src/clj/clojure/core.clj25
1 files changed, 15 insertions, 10 deletions
diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj
index e2162032..2e4bff94 100644
--- a/src/clj/clojure/core.clj
+++ b/src/clj/clojure/core.clj
@@ -1684,19 +1684,24 @@
"Returns a lazy sequence of x, (f x), (f (f x)) etc. f must be free of side-effects"
[f x] (cons x (lazy-seq (iterate f (f x)))))
-(defn range
+(defn range
"Returns a lazy seq of nums from start (inclusive) to end
(exclusive), by step, where start defaults to 0 and step to 1."
- ([end] (if (and (> end 0) (<= end (. Integer MAX_VALUE)))
- (new clojure.lang.Range 0 end)
- (take end (iterate inc 0))))
- ([start end] (if (and (< start end)
- (>= start (. Integer MIN_VALUE))
- (<= end (. Integer MAX_VALUE)))
- (new clojure.lang.Range start end)
- (take (- end start) (iterate inc start))))
+ ([end] (range 0 end 1))
+ ([start end] (range start end 1))
([start end step]
- (take-while (partial (if (pos? step) > <) end) (iterate (partial + step) start))))
+ (lazy-seq
+ (let [b (chunk-buffer 32)
+ comp (if (pos? step) < >)]
+ (loop [i start]
+ (if (and (< (count b) 32)
+ (comp i end))
+ (do
+ (chunk-append b i)
+ (recur (+ i step)))
+ (chunk-cons (chunk b)
+ (when (comp i end)
+ (range i end step)))))))))
(defn merge
"Returns a map that consists of the rest of the maps conj-ed onto