(defn combinations
[items r]
(let [size (count items)]
(if (= r size)
[ (set items) ]
(if (= 1 r)
(map #(set [%]) items)
(let [fst #{ (first items) } rst (rest items)]
(concat
(map #(union fst %) (combinations rst (dec r)))
(combinations rst r)))))))