From d77d9f176a0fffb9ae482b26f34afed6c9bd9705 Mon Sep 17 00:00:00 2001 From: Timothy Baldridge Date: Fri, 26 Oct 2012 22:10:12 -0400 Subject: [PATCH] added queue, queue*, and queue? to core.clj --- src/clj/clojure/core.clj | 52 ++++++++++++++++++++++++ src/jvm/clojure/lang/PersistentQueue.java | 2 +- test/clojure/test_clojure/data_structures.clj | 53 ++++++++++++++++--------- test/clojure/test_clojure/java_interop.clj | 3 -- 4 files changed, 87 insertions(+), 23 deletions(-) diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj index 985532a..cef57d8 100644 --- a/src/clj/clojure/core.clj +++ b/src/clj/clojure/core.clj @@ -6872,3 +6872,55 @@ (catch Throwable t (.printStackTrace t) (throw t))) + + +;;;;;;;;;;;;;;;;;;;;; Persistent Queue ;;;;;;;;;;;;;;;;; + +(defn queue + "Constructs a persistent queue" + {:added "1.5"} + ([] (. clojure.lang.PersistentQueue EMPTY)) + ([a] (clojure.lang.PersistentQueue. nil 1 (list a) nil)) + ([a b] (clojure.lang.PersistentQueue. nil 2 (list a b) nil)) + ([a b c] (clojure.lang.PersistentQueue. nil 3 (list a b c) nil)) + ([a b c d] (clojure.lang.PersistentQueue. nil 4 (list a b c d) nil)) + ([a b c d & args] + (clojure.lang.PersistentQueue. nil + (+ 4 (count args)) + (list* a b c d args) + nil))) + +(defn queue* + "Constructs a PersistentQueue expects the last argument + to be seqable" + {:added "1.5"} + ([] (. clojure.lang.PersistentQueue EMPTY)) + ([args] (clojure.lang.PersistentQueue. nil (count args) (seq args) nil)) + ([a args] + (clojure.lang.PersistentQueue. nil + (+ 1 (count args)) + (list* a args) + nil)) + ([a b args] + (clojure.lang.PersistentQueue. nil + (+ 2 (count args)) + (list* a b args) + nil)) + ([a b c args] + (clojure.lang.PersistentQueue. nil + (+ 3 (count args)) + (list* a b c args) + nil)) + ([a b c d & more] + (let [lst (apply list* a b c d more)] + (clojure.lang.PersistentQueue. nil + (count lst) + lst + nil)))) + + +(defn queue? + "Returns true if arg is a instance of PersistentQueue" + {:added "1.5"} + [arg] (instance? clojure.lang.PersistentQueue arg)) + diff --git a/src/jvm/clojure/lang/PersistentQueue.java b/src/jvm/clojure/lang/PersistentQueue.java index 0b9051d..5999207 100644 --- a/src/jvm/clojure/lang/PersistentQueue.java +++ b/src/jvm/clojure/lang/PersistentQueue.java @@ -32,7 +32,7 @@ final PersistentVector r; //static final int INITIAL_REAR_SIZE = 4; int _hash = -1; -PersistentQueue(IPersistentMap meta, int cnt, ISeq f, PersistentVector r){ +public PersistentQueue(IPersistentMap meta, int cnt, ISeq f, PersistentVector r){ super(meta); this.cnt = cnt; this.f = f; diff --git a/test/clojure/test_clojure/data_structures.clj b/test/clojure/test_clojure/data_structures.clj index 3d913b3..718839f 100644 --- a/test/clojure/test_clojure/data_structures.clj +++ b/test/clojure/test_clojure/data_structures.clj @@ -123,7 +123,7 @@ ;; *** Collections *** (deftest test-count - (let [EMPTY clojure.lang.PersistentQueue/EMPTY] + (let [EMPTY (queue)] (are [x y] (= (count x) y) EMPTY 0 (into EMPTY [:a :b]) 2 @@ -861,26 +861,41 @@ ;; *** Queues *** (deftest test-queues - (let [EMPTY clojure.lang.PersistentQueue/EMPTY] + (let [EMPTY (queue)] (are [x y] (= x y) - EMPTY EMPTY - (into EMPTY (range 50)) (into EMPTY (range 50)) - (conj EMPTY (Long. -1)) (conj EMPTY (Integer. -1)) - (hash (conj EMPTY (Long. -1))) (hash (conj EMPTY (Integer. -1))) - (hash [1 2 3]) (hash (conj EMPTY 1 2 3)) - (range 5) (into EMPTY (range 5)) - (range 1 6) (-> EMPTY - (into (range 6)) - pop)) + EMPTY EMPTY + (into EMPTY (range 50)) (into EMPTY (range 50)) + (conj EMPTY (Long. -1)) (conj EMPTY (Integer. -1)) + (hash (conj EMPTY (Long. -1))) (hash (conj EMPTY (Integer. -1))) + (hash [1 2 3]) (hash (conj EMPTY 1 2 3)) + (range 5) (into EMPTY (range 5)) + (range 1 6) (-> EMPTY + (into (range 6)) + pop) + (queue) EMPTY + (queue 1) '(1) + (queue 1 2) '(1 2) + (queue 1 2 3) '(1 2 3) + (queue 1 2 3 4) '(1 2 3 4) + (queue 1 2 3 4 5) '(1 2 3 4 5) + (queue* (range 10)) (range 10) + (queue* 1 (range 10)) (concat '(1) (range 10)) + (queue* 1 2 (range 10)) (concat '(1 2) (range 10)) + (queue* 1 2 3 (range 10)) (concat '(1 2 3) (range 10)) + (queue* 1 2 3 4 (range 10)) (concat '(1 2 3 4) (range 10)) + (queue* 1 2 3 4 5 (range 10)) (concat '(1 2 3 4 5) (range 10)) + (queue? (queue)) true + (queue? (queue 1)) true + (queue? (queue* (range 10))) true) (are [x y] (not= x y) - (range 5) (into EMPTY (range 6)) - (range 6) (into EMPTY (range 5)) - (range 0 6) (-> EMPTY - (into (range 6)) - pop) - (range 1 6) (-> EMPTY - (into (range 7)) - pop)))) + (range 5) (into EMPTY (range 6)) + (range 6) (into EMPTY (range 5)) + (range 0 6) (-> EMPTY + (into (range 6)) + pop) + (range 1 6) (-> EMPTY + (into (range 7)) + pop)))) (deftest test-duplicates diff --git a/test/clojure/test_clojure/java_interop.clj b/test/clojure/test_clojure/java_interop.clj index e073f9d..b8b9926 100644 --- a/test/clojure/test_clojure/java_interop.clj +++ b/test/clojure/test_clojure/java_interop.clj @@ -284,9 +284,6 @@ (to-array []) (to-array [1 2 3]) )) -(defn queue [& contents] - (apply conj (clojure.lang.PersistentQueue/EMPTY) contents)) - (defn array-typed-equals [expected actual] (and (= (class expected) (class actual)) (java.util.Arrays/equals expected actual))) -- 1.7.10.2 (Apple Git-33)