「数字混じりソート」さらに改

昨日のコードを更に改造。

(use '[clojure.contrib.str-utils :only (re-partition)]
     '[clojure.contrib.core :only (-?>)])

(defn apply-flip [f a b]
  (f b a))

(defn parse [s]
  (->> (re-partition #"\d+" s)
       (apply-flip concat [nil nil])
       (partition 2)
       (mapcat (juxt first #(-?> % second Integer/parseInt)))))

(defn mixed-compare [parse a b]
  (->> (map list (parse a) (parse b))
       (drop-while (fn [[x y]] (and (= x y) (-> x nil? not))))
       first
       (apply compare)))

(defn mixed-sort [xs]
  (sort (partial mixed-compare parse) xs))

(defn memoized-mixed-sort [xs]
  (sort (partial mixed-compare (memoize parse)) xs))

これまでは parse の返すコレクションを丸ごと compare へ渡す方針でやってましたが、今回はコレクションの要素を順に compare してみました。 ではなく、コレクションの要素を順に比較して、異なる要素を見付けたところで compare を適用しています。
何となく無駄が無くなったような気はしますが、パフォーマンス的にはあんまり変ってないようです。