diff options
author | Stuart Halloway <stu@thinkrelevance.com> | 2010-04-21 21:04:19 -0400 |
---|---|---|
committer | Stuart Halloway <stu@thinkrelevance.com> | 2010-04-22 13:34:28 -0400 |
commit | c2a6a070665289afb425afbe8711fcb09e4d1ab0 (patch) | |
tree | 66c747b70884fb20469d918a1946906c5b4ecc0f | |
parent | 15a2b2e553b078b7e482da822dcb9f8c28c2016c (diff) |
reversible support for Vec #267
Signed-off-by: Stuart Halloway <stu@thinkrelevance.com>
-rw-r--r-- | src/clj/clojure/gvec.clj | 10 | ||||
-rw-r--r-- | src/jvm/clojure/lang/APersistentVector.java | 4 | ||||
-rw-r--r-- | test/clojure/test_clojure/vectors.clj | 19 |
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) |