Skip to content

Commit 7919c04

Browse files
committed
Implement range
1 parent 6bc098d commit 7919c04

File tree

2 files changed

+48
-1
lines changed
  • language-adaptors/rxjava-clojure/src

2 files changed

+48
-1
lines changed

language-adaptors/rxjava-clojure/src/main/clojure/rx/lang/clojure/core.clj

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
interleave interpose into iterate
88
keep keep-indexed
99
map mapcat map-indexed
10-
merge next nth partition-all reduce reductions
10+
merge next nth partition-all
11+
range reduce reductions
1112
rest seq some sort sort-by split-with
1213
take take-while throw])
1314
(:require [rx.lang.clojure.interop :as iop]
@@ -678,6 +679,30 @@
678679
([n ^Observable xs] (.window xs (int n)))
679680
([n step ^Observable xs] (.window xs (int n) (int step))))
680681

682+
(defn range
683+
"Returns an Observable nums from start (inclusive) to end
684+
(exclusive), by step, where start defaults to 0, step to 1, and end
685+
to infinity.
686+
687+
Note: this is not implemented on rx.Observable/range
688+
689+
See:
690+
clojure.core/range
691+
"
692+
([] (range 0 Double/POSITIVE_INFINITY 1))
693+
([end] (range 0 end 1))
694+
([start end] (range start end 1))
695+
([start end step]
696+
(observable* (fn [s]
697+
(let [comp (if (pos? step) < >)]
698+
(loop [i start]
699+
(if-not (unsubscribed? s)
700+
(if (comp i end)
701+
(do
702+
(on-next s i)
703+
(recur (+ i step)))
704+
(on-completed s)))))))))
705+
681706
(defn ^Observable reduce
682707
([f ^Observable xs] (.reduce xs (iop/fn* f)))
683708
([f val ^Observable xs] (.reduce xs val (iop/fn* f))))

language-adaptors/rxjava-clojure/src/test/clojure/rx/lang/clojure/core_test.clj

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,28 @@
498498
10 3
499499
15 30))
500500

501+
(deftest test-range
502+
(are [start end step] (= (range start end step)
503+
(->> (rx/range start end step) (b/into [])))
504+
0 10 2
505+
0 -100 -1
506+
5 100 9)
507+
508+
(are [start end] (= (range start end)
509+
(->> (rx/range start end) (b/into [])))
510+
0 10
511+
0 -100
512+
5 100)
513+
514+
(are [start] (= (->> (range start) (take 100))
515+
(->> (rx/range start) (rx/take 100) (b/into [])))
516+
50
517+
0
518+
5
519+
-20)
520+
(is (= (->> (range) (take 500))
521+
(->> (rx/range) (rx/take 500) (b/into [])))))
522+
501523
(deftest test-reduce
502524
(is (= (reduce + 0 (range 4))
503525
(b/first (rx/reduce + 0 (rx/seq->o (range 4)))))))

0 commit comments

Comments
 (0)