summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStuart Halloway <stu@thinkrelevance.com>2010-04-21 21:04:19 -0400
committerStuart Halloway <stu@thinkrelevance.com>2010-04-22 13:34:28 -0400
commitc2a6a070665289afb425afbe8711fcb09e4d1ab0 (patch)
tree66c747b70884fb20469d918a1946906c5b4ecc0f
parent15a2b2e553b078b7e482da822dcb9f8c28c2016c (diff)
reversible support for Vec #267
Signed-off-by: Stuart Halloway <stu@thinkrelevance.com>
-rw-r--r--src/clj/clojure/gvec.clj10
-rw-r--r--src/jvm/clojure/lang/APersistentVector.java4
-rw-r--r--test/clojure/test_clojure/vectors.clj19
3 files changed, 29 insertions, 4 deletions
diff --git a/src/clj/clojure/gvec.clj b/src/clj/clojure/gvec.clj
index 6c025835..ff89aade 100644
--- a/src/clj/clojure/gvec.clj
+++ b/src/clj/clojure/gvec.clj
@@ -194,7 +194,7 @@
(or (instance? clojure.lang.Sequential o) (instance? java.util.List o))
(= (seq this) (seq o))
:else false))
-
+
clojure.lang.IPersistentStack
(peek [this]
(when (> cnt (int 0))
@@ -233,7 +233,13 @@
(new Vec am cnt shift (.doAssoc this shift root i val) tail (meta this)))
(= i cnt) (.cons this val)
:else (throw (IndexOutOfBoundsException.))))
-
+
+ clojure.lang.Reversible
+ (rseq [this]
+ (if (> (.count this) 0)
+ (clojure.lang.APersistentVector$RSeq. this (dec (.count this)))
+ nil))
+
clojure.lang.Associative
(assoc [this k v]
(if (clojure.lang.Util/isInteger k)
diff --git a/src/jvm/clojure/lang/APersistentVector.java b/src/jvm/clojure/lang/APersistentVector.java
index 7ac9f32b..a6b7405f 100644
--- a/src/jvm/clojure/lang/APersistentVector.java
+++ b/src/jvm/clojure/lang/APersistentVector.java
@@ -458,11 +458,11 @@ public int compareTo(Object o){
}
}
-static class RSeq extends ASeq implements IndexedSeq, Counted{
+public static class RSeq extends ASeq implements IndexedSeq, Counted{
final IPersistentVector v;
final int i;
- RSeq(IPersistentVector vector, int i){
+ public RSeq(IPersistentVector vector, int i){
this.v = vector;
this.i = i;
}
diff --git a/test/clojure/test_clojure/vectors.clj b/test/clojure/test_clojure/vectors.clj
index 654a5b84..35341e85 100644
--- a/test/clojure/test_clojure/vectors.clj
+++ b/test/clojure/test_clojure/vectors.clj
@@ -11,6 +11,25 @@
(ns clojure.test-clojure.vectors
(:use clojure.test))
+(deftest test-reversed-vec
+ (let [r (range 6)
+ v (into (vector-of :int) r)
+ reversed (.rseq v)]
+ (testing "returns the right impl"
+ (is (= clojure.lang.APersistentVector$RSeq (class reversed))))
+ (testing "RSeq methods"
+ (is (= [5 4 3 2 1 0] reversed))
+ (is (= 5 (.index reversed)))
+ (is (= 5 (.first reversed)))
+ (is (= [4 3 2 1 0] (.next reversed)))
+ (is (= [3 2 1 0] (.. reversed next next)))
+ (is (= 6 (.count reversed))))
+ (testing "clojure calling through"
+ (is (= 5 (first reversed)))
+ (is (= 5 (nth reversed 0))))
+ (testing "empty reverses to nil"
+ (is (nil? (.. v empty rseq))))))
+
(deftest test-vecseq
(let [r (range 100)
vs (into (vector-of :int) r)