Compare commits
9 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7ca72b2ef7 | ||
|
|
5e120d3240 | ||
|
|
2761f73b0d | ||
|
|
9344b38494 | ||
|
|
e7f0b18716 | ||
|
|
7baae299a6 | ||
|
|
67a8c8d4cf | ||
|
|
e4ba7ef56f | ||
|
|
0655f39dc9 |
2 changed files with 45 additions and 26 deletions
2
sci
2
sci
|
|
@ -1 +1 @@
|
|||
Subproject commit b74cdc1f7f1e9a9136a7439b828f02f22251b901
|
||||
Subproject commit 32801896e4d9533b3b61453b4ebb813042c59e5c
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
(ns babashka.impl.reify
|
||||
{:no-doc true}
|
||||
(:require [clojure.math.combinatorics :as combo]))
|
||||
(:require [clojure.math.combinatorics :as combo]
|
||||
[sci.impl.types]))
|
||||
|
||||
(set! *warn-on-reflection* false)
|
||||
|
||||
|
|
@ -8,33 +9,51 @@
|
|||
"Generates pre-compiled reify combinations"
|
||||
[methods]
|
||||
(let [subsets (rest (combo/subsets (seq methods)))]
|
||||
(reduce (fn [opts classes]
|
||||
(assoc opts
|
||||
(set (map (fn [[class _]]
|
||||
(list 'quote class))
|
||||
classes))
|
||||
(list 'fn ['methods]
|
||||
(list* 'reify
|
||||
(mapcat
|
||||
(fn [[clazz methods]]
|
||||
(cons clazz
|
||||
(mapcat
|
||||
(fn [[meth arities]]
|
||||
(map
|
||||
(fn [arity]
|
||||
(list meth arity
|
||||
(list*
|
||||
(list 'get-in 'methods
|
||||
[(list 'quote clazz) (list 'quote meth)])
|
||||
arity)))
|
||||
arities))
|
||||
methods)))
|
||||
classes)))))
|
||||
(reduce (fn [opts [classes protocols?]]
|
||||
(let [prelude '[reify]
|
||||
prelude (if protocols?
|
||||
(conj prelude
|
||||
'sci.impl.types.IReified
|
||||
'(getInterfaces [this]
|
||||
interfaces)
|
||||
'(getMethods [this]
|
||||
methods)
|
||||
'(getProtocols [this]
|
||||
protocols))
|
||||
prelude)]
|
||||
(assoc opts
|
||||
(cond-> (set (map #(list 'quote %)
|
||||
(map first classes)))
|
||||
protocols?
|
||||
(conj (list 'quote 'sci.impl.types.IReified)))
|
||||
(list 'fn ['interfaces 'methods 'protocols]
|
||||
(concat prelude
|
||||
(mapcat
|
||||
(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
|
||||
{java.io.FileFilter {accept [[this f]]}})))
|
||||
{java.io.FileFilter {accept [[this f]]}})))
|
||||
|
||||
#_:clj-kondo/ignore
|
||||
(def reify-opts
|
||||
|
|
|
|||
Loading…
Reference in a new issue