(defmulti java-fn (fn [klass f] klass)) (let [scan-results (-> (io.github.classgraph.ClassGraph.) ;; (.verbose) (.enableAllInfo) (.enableSystemJarsAndModules) (.acceptPackages (into-array String ["java.util.function"])) (.scan))] (doseq [info (.getAllInterfaces scan-results) :let [klass (.loadClass info)]] (eval `(import ~(symbol (.getName klass)))) (.addMethod java-fn klass (eval `(fn [~'_ ~'f] (reify ~(symbol (.getName info)) ~@(for [m (.getDeclaredMethods klass) :when (java.lang.reflect.Modifier/isPublic (.getModifiers m)) :when (java.lang.reflect.Modifier/isAbstract (.getModifiers m)) :let [argv (count (.getParameters m)) args (repeatedly argv gensym)]] `(~(symbol (.getName m)) [~'this ~@args] (~'f ~@args)))))))))
Generated At 2022-12-14T11:55:26-0800 original