diff options
author | David Liebke and Stuart Halloway <pair@clojure.com> | 2010-05-28 10:10:15 -0400 |
---|---|---|
committer | Stuart Halloway <stu@thinkrelevance.com> | 2010-06-03 21:20:58 -0400 |
commit | 4997e807b5962443eb2c41463cb1432b7cc5f613 (patch) | |
tree | ca3b1752fa08682b5bc97697750c0431c74450e1 | |
parent | c4265058f8d095978ac85a38cbfdb592d0e8d8d7 (diff) |
make join faster #359
Signed-off-by: Stuart Halloway <stu@thinkrelevance.com>
-rw-r--r-- | src/clj/clojure/string.clj | 13 | ||||
-rw-r--r-- | test/clojure/test_clojure/string.clj | 13 |
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"))) |