itertoolsをclojureで(permutations)

pythonのitertools.permutationsをclojureで書いてみました。
clojure.contrib.combinatorics/permutationsが既にありますが、それはそれとして。

(ns itertools
  (:use clojure.contrib.seq-utils
        [clojure.contrib.combinatorics :only (cartesian-product)]))

(defn cartesian-product-repeat [s r]
  (apply cartesian-product (repeat r s)))

(defn permutations [s & [r]]
  (let [r (or r (count s))]
    (for [indices (cartesian-product-repeat (range (count s)) r)
          :when (== (count (set indices)) r)]
      (vec (for [i indices] (nth s i))))))