Clojureの関数で渡されたものと同じ型のコレクションを返すには?
例えば次のような関数を定義したとして、渡されたコレクションと同じ型を返す良い方法はないでしょうか? ただし、評価値の順序がおかしくならないようにお願いします。
(defn rotate [n coll]
(let [at (if (neg? n) (Math/abs n) (- (count coll) n))
[left right] (split-at at coll)]
(concat right left)))
こんなやりかたを考えてみましたが、ごちゃごちゃして気持ち悪いですよね。 何かシンプルな方法はないでしょうか?
(defmulti vomit (fn [coll]
(if (list? coll) :list (if (vector? coll) :vector))) :default nil)
(defmethod vomit :list [coll] (partial apply list))
(defmethod vomit :vector [coll] (partial into (empty coll)))
(defmethod vomit nil [coll] identity)
(defn rotate [n coll]
(let [at (if (neg? n) (Math/abs n) (- (count coll) n))
[left right] (split-at at coll)]
((vomit coll) (concat right left))))