       (conj srcs src)))
   (possible-sources [_] srcs)
   (equivalent-targets [_ dst]
-    (->> (vals m-by-arity)
-         (mapcat collect-targets)
-         (map first)
-         (filter #(assignable? % dst))
-         (set)))
+    (into #{} (comp (mapcat collect-targets)
+                    (map first)
+                    (filter #(assignable? % dst)))
+          (vals m-by-arity)))
   (possible-conversions [_ src]
-    (let [result (volatile! (vector))]
+    (let [^Types src src
+          result (volatile! [])]
       (search-for-possible-sources
         result
-        (get m-by-arity (.arity ^Types src))
-        (vector)
-        (first (.types ^Types src))
-        (next (.types ^Types src)))
+        (m-by-arity (.arity src))
+        []
+        (first (.types src))
+        (next (.types src)))
       @result)))
 
 (defn conversion-graph []

              [src -> String]"
  [g ^Types src]
  (if (> (.arity src) max-arity)
    (vector)
    (->> (continuous-combinations (.arity src))
         (mapcat
           (fn [idxs]


(defn- conj-path [^ConversionPath p src dst ^Conversion c]
  (ConversionPath.
    (conj (.path p) [src dst])
    (conj (.fns p) (.f c))
    (conj (.visited? p) dst)
    (+ (.cost p) (.cost c))))
