This is just a little note about one of my favorite datatypes in Clojure.
Like most Lisps, Clojure has a very useful group of datatypes built in including some
set types. I use
sorted-set a lot. Until recently, I hadn’t noticed
sorted-set-by, a function that returns a sorted set using a comparator you specify. I found myself needing to create a sorted set of strings where the sorting was case-insensitive. The
sorted-set-by function was exactly what I needed.
Here’s an example of usage.
(defn- case-insensitive-comparator "Case-insensitive string comparator." [^String s1 ^String s2] (.compareToIgnoreCase s1 s2)) (defn get-all-users "Return a sorted set of all of the user names known to the wiki." ( (get-all-users h2-db)) ([db-name] (when-let [user-array (jdbc/query db-name ["select user_name from users"])] (into (sorted-set-by case-insensitive-comparator) (mapv #(:user_name %) user-array)))))
case-insensitive-comparator function is probably a bit of over-engineering. Since this comparator just calls the built-in Java comparator, I could have used the
.compareToIgnorecase function more directly.