summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Liebke and Stuart Halloway <pair@clojure.com>2010-05-28 10:10:15 -0400
committerStuart Halloway <stu@thinkrelevance.com>2010-06-03 21:20:58 -0400
commit4997e807b5962443eb2c41463cb1432b7cc5f613 (patch)
treeca3b1752fa08682b5bc97697750c0431c74450e1
parentc4265058f8d095978ac85a38cbfdb592d0e8d8d7 (diff)
make join faster #359
Signed-off-by: Stuart Halloway <stu@thinkrelevance.com>
-rw-r--r--src/clj/clojure/string.clj13
-rw-r--r--test/clojure/test_clojure/string.clj13
2 files changed, 21 insertions, 5 deletions
diff --git a/src/clj/clojure/string.clj b/src/clj/clojure/string.clj
index dea65b07..a50c8753 100644
--- a/src/clj/clojure/string.clj
+++ b/src/clj/clojure/string.clj
@@ -70,8 +70,17 @@
(defn ^String join
"Returns a string of all elements in coll, separated by
separator. Like Perl's join."
- [^String separator coll]
- (apply str (interpose separator coll)))
+ ([coll]
+ (apply str coll))
+ ([separator [x & more]]
+ (loop [sb (StringBuilder. (str x))
+ more more
+ sep (str separator)]
+ (if more
+ (recur (-> sb (.append sep) (.append (str (first more))))
+ (next more)
+ sep)
+ (str sb)))))
(defn ^String chop
"Removes the last character of string, does nothing on a zero-length
diff --git a/test/clojure/test_clojure/string.clj b/test/clojure/test_clojure/string.clj
index 255e47a6..739f7bb4 100644
--- a/test/clojure/test_clojure/string.clj
+++ b/test/clojure/test_clojure/string.clj
@@ -15,9 +15,16 @@
(is (= "FOObarfoo" (s/replace-first-by #"foo" s/upper-case "foobarfoo"))))
(deftest t-join
- (is (= "1,2,3" (s/join \, [1 2 3])))
- (is (= "" (s/join \, [])))
- (is (= "1 and-a 2 and-a 3" (s/join " and-a " [1 2 3]))))
+ (are [x coll] (= x (s/join coll))
+ "" nil
+ "" []
+ "1" [1]
+ "12" [1 2])
+ (are [x sep coll] (= x (s/join sep coll))
+ "1,2,3" \, [1 2 3]
+ "" \, []
+ "1" \, [1]
+ "1 and-a 2 and-a 3" " and-a " [1 2 3]))
(deftest t-chop
(is (= "fo" (s/chop "foo")))