In service of some other code I was writing, I ran across the need for a function to center a string within a space-padded length. My solution works and I think is easy to read, but I suspect you can do far better (so please share). My solution does not handle or check for a string smaller than the requested padded length.
(defn repeat-str "Create a string that repeats s n times." [s n] (apply str (repeat n s))) (defn spaces "Create a string of n spaces." [n] (repeat-str \space n)) (defn center "Center s in padding to final size len" [s len] (let [slen (count s) lpad (int (/ (- len slen) 2)) rpad (- len slen lpad)] (str (spaces lpad) s (spaces rpad))))
I needed repeat-str nearby for something other than spaces, so there is value for me in breaking those apart.
I also had fun writing some tests with clojure.test:
(deftest test-center ;; test cases where pad length < string length (let [s "abc"] (doall (map #(is (= s (center s %1))) (range (count s))))) ;; given a seed string test expected results from padding ;; from length of string to as many expected results given (are [s expected-vals] (doall (map-indexed #(is (= %2 (center s (+ (count s) %1)))) expected-vals)) "" ["" " " " "] "a" ["a" "a " " a " " a "] "ab" ["ab" "ab " " ab " " ab "] "abc" ["abc" "abc " " abc "]))
How can I make these better?