diff options
author | Rich Hickey <richhickey@gmail.com> | 2009-06-20 12:56:29 -0400 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2009-06-20 12:56:29 -0400 |
commit | 73059ebdbfebb361eff01079eccfd4591ab82055 (patch) | |
tree | 0bd38ecc60c7bb9d9dd169e9261d317ee5d48af8 | |
parent | 2a5fa05b05c880a1f08110edaabf644b8a39e6ea (diff) |
made range chunked
-rw-r--r-- | src/clj/clojure/core.clj | 25 |
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 |