This commit is contained in:
Michiel Borkent 2021-03-06 00:52:52 +01:00
parent 9344b38494
commit 2761f73b0d
2 changed files with 43 additions and 26 deletions

2
sci

@ -1 +1 @@
Subproject commit c9081df5788f6336108bd530e0aa7da3d42d42bb Subproject commit 79ae49faaedadfb4572b144b4f50744146416d48

View file

@ -9,29 +9,48 @@
"Generates pre-compiled reify combinations" "Generates pre-compiled reify combinations"
[methods] [methods]
(let [subsets (rest (combo/subsets (seq methods)))] (let [subsets (rest (combo/subsets (seq methods)))]
(reduce (fn [opts classes] (reduce (fn [opts [classes protocols?]]
(assoc opts (let [prelude '[reify]
(set (map (fn [[class _]] prelude (if protocols?
(list 'quote class)) (conj prelude
classes)) 'sci.impl.types.IReified
(list 'fn ['methods] '(getInterfaces [this]
(list* 'reify interfaces)
(mapcat '(getMethods [this]
(fn [[clazz methods]] methods)
(cons clazz '(getProtocols [this]
(mapcat protocols))
(fn [[meth arities]] prelude)]
(map (assoc opts
(fn [arity] (cond-> (set (map #(list 'quote %)
(list meth arity classes))
(list* protocols?
(list 'get 'methods (list 'quote meth)) (conj (list 'quote 'sci.impl.IReified)))
arity))) (list 'fn ['interfaces 'methods 'protocols]
arities)) (concat prelude
methods))) (mapcat
classes))))) (fn [[clazz methods]]
(cons clazz
(mapcat
(fn [[meth arities]]
(map
(fn [arity]
(list meth arity
(list*
(list 'get 'methods (list 'quote meth))
arity)))
arities))
methods)))
classes))))))
{} {}
subsets))) (concat (map (fn [subset bool]
[subset bool])
subsets
(repeat true))
(map (fn [subset bool]
[subset bool])
subsets
(repeat false))))))
#_(prn (macroexpand '(gen-reify-combos #_(prn (macroexpand '(gen-reify-combos
{java.io.FileFilter {accept [[this f]]}}))) {java.io.FileFilter {accept [[this f]]}})))
@ -39,9 +58,7 @@
#_:clj-kondo/ignore #_:clj-kondo/ignore
(def reify-opts (def reify-opts
(gen-reify-combos (gen-reify-combos
{sci.impl.types.IReified {getMethods [[this]] {java.nio.file.FileVisitor {preVisitDirectory [[this p attrs]]
getInterfaces [[this]]}
java.nio.file.FileVisitor {preVisitDirectory [[this p attrs]]
postVisitDirectory [[this p attrs]] postVisitDirectory [[this p attrs]]
visitFile [[this p attrs]]} visitFile [[this p attrs]]}
java.io.FileFilter {accept [[this f]]} java.io.FileFilter {accept [[this f]]}