@@ -7,106 +7,46 @@ abstract type Distribution{T} end
77
88Base. eltype (:: Type{<:Distribution{T}} ) where {T} = T
99
10- abstract type Make{T} <: Distribution{T} end
11-
12- struct Make0{T} <: Make{T} end
13-
14- Make ( :: Type{T} ) where {T} = Make0 {T} ()
15- Make0 (:: Type{T} ) where {T} = Make0 {T} ()
16- make (:: Type{T} ) where {T} = Make0 {maketype(T)} ()
10+ struct Make{T,X<: Tuple , XX<: Tuple } <: Distribution{T}
11+ # XX is X with Type{A} replaced by Nothing (otherwise, X (e.g. Tuple{Type{Int}}) can't have instances)
12+ x:: XX
13+ end
1714
18- # default
19- maketype (:: Type{T} ) where {T} = T
15+ # @inline necessary for one @inferred test on arrays
16+ @inline Base. getindex (m:: Make{T,X} , i:: Int ) where {T,X} =
17+ fieldtype (X, i) <: Type ?
18+ fieldtype (X, i). parameters[1 ] :
19+ m. x[i]
2020
21- struct Make1{T,X} <: Make{T}
22- x:: X
21+ @generated function Make {T} (X... ) where T
22+ XX = Tuple{(x <: Type ? Nothing : x for x in X). .. }
23+ y = [x <: Type ? nothing : :(X[$ i]) for (i, x) in enumerate (X)]
24+ :(Make {T,Tuple{$X...},$XX} (tuple ($ (y... ))))
2325end
2426
25- Make {T} (x:: X ) where {T,X} = Make1 {T,X} ( x)
26- Make {T} (:: Type{X} ) where {T,X} = Make1 {T,Type{X}} (X)
27+ Make0{T} = Make{T,Tuple{}}
28+ Make1{T} = Make{T,Tuple{X}} where X
29+ Make2{T} = Make{T,Tuple{X,Y}} where {X, Y}
30+ Make3{T} = Make{T,Tuple{X,Y,Z}} where {X, Y, Z}
2731
28- # for expliciteness (allows using Make1 instead of Make)
29- Make1 {T} (x:: X ) where {T,X} = Make1 {T,X} ( x)
30- Make1 {T} (:: Type{X} ) where {T,X} = Make1 {T,Type{X}} (X)
32+ Make0 {T} () where {T} = Make {T} ()
33+ Make1 {T} (x) where {T} = Make {T} (x)
34+ Make2 {T} (x, y) where {T} = Make {T} (x, y)
35+ Make3 {T} (x, y, z) where {T} = Make {T} (x, y, z)
3136
32- make ( :: Type{T} , x :: X ) where {T,X} = Make {maketype(T,x)} (x)
33- make (:: Type{T} , :: Type{X} ) where {T,X } = Make {maketype(T,X)} (X)
37+ # default maketype & make
38+ maketype (:: Type{T} , x ... ) where {T} = T
3439
35- # default
36- maketype (:: Type{T} , x) where {T} = T
40+ make (:: Type{T} , x... ) where {T} = Make {maketype(T, x...)} (x... )
3741
3842find_deduced_type (:: Type{T} , :: X , ) where {T,X} = deduce_type (T, gentype (X))
3943find_deduced_type (:: Type{T} , :: Type{X} ) where {T,X} = deduce_type (T, X)
4044
41- struct Make2{T,X,Y} <: Make{T}
42- x:: X
43- y:: Y
44- end
45-
46- Make {T} (x:: X , y:: Y ) where {T,X,Y} = Make2 {T,X, Y} ( x, y)
47- Make {T} (:: Type{X} , y:: Y ) where {T,X,Y} = Make2 {T,Type{X},Y} ( X, y)
48- Make {T} (x:: X , :: Type{Y} ) where {T,X,Y} = Make2 {T,X, Type{Y}} (x, Y)
49- Make {T} (:: Type{X} , :: Type{Y} ) where {T,X,Y} = Make2 {T,Type{X},Type{Y}} (X, Y)
50-
51- # for expliciteness (allows using Make2 instead of Make)
52- Make2 {T} (x:: X , y:: Y ) where {T,X,Y} = Make2 {T,X, Y} ( x, y)
53- Make2 {T} (:: Type{X} , y:: Y ) where {T,X,Y} = Make2 {T,Type{X},Y} ( X, y)
54- Make2 {T} (x:: X , :: Type{Y} ) where {T,X,Y} = Make2 {T,X, Type{Y}} (x, Y)
55- Make2 {T} (:: Type{X} , :: Type{Y} ) where {T,X,Y} = Make2 {T,Type{X},Type{Y}} (X, Y)
56-
57- make (:: Type{T} , x:: X , y:: Y ) where {T,X,Y} = Make {maketype(T,x,y)} (x, y)
58- make (:: Type{T} , :: Type{X} , y:: Y ) where {T,X,Y} = Make {maketype(T,X,y)} (X, y)
59- make (:: Type{T} , x:: X , :: Type{Y} ) where {T,X,Y} = Make {maketype(T,x,Y)} (x, Y)
60- make (:: Type{T} , :: Type{X} , :: Type{Y} ) where {T,X,Y} = Make {maketype(T,X,Y)} (X, Y)
61-
62- # default
63- maketype (:: Type{T} , x, y) where {T} = T
64-
6545find_deduced_type (:: Type{T} , :: X , :: Y ) where {T,X,Y} = deduce_type (T, gentype (X), gentype (Y))
6646find_deduced_type (:: Type{T} , :: Type{X} , :: Y ) where {T,X,Y} = deduce_type (T, X, gentype (Y))
6747find_deduced_type (:: Type{T} , :: X , :: Type{Y} ) where {T,X,Y} = deduce_type (T, gentype (X), Y)
6848find_deduced_type (:: Type{T} , :: Type{X} , :: Type{Y} ) where {T,X,Y} = deduce_type (T, X, Y)
6949
70- struct Make3{T,X,Y,Z} <: Make{T}
71- x:: X
72- y:: Y
73- z:: Z
74- end
75-
76- Make {T} (x:: X , y:: Y , z:: Z ) where {T,X,Y,Z} = Make3 {T,X, Y, Z } (x, y, z)
77- Make {T} (:: Type{X} , y:: Y , z:: Z ) where {T,X,Y,Z} = Make3 {T,Type{X},Y, Z } (X, y, z)
78- Make {T} (x:: X , :: Type{Y} , z:: Z ) where {T,X,Y,Z} = Make3 {T,X, Type{Y},Z } (x, Y, z)
79- Make {T} (:: Type{X} , :: Type{Y} , z:: Z ) where {T,X,Y,Z} = Make3 {T,Type{X},Type{Y},Z } (X, Y, z)
80- Make {T} (x:: X , y:: Y , :: Type{Z} ) where {T,X,Y,Z} = Make3 {T,X, Y, Type{Z}} (x, y, Z)
81- Make {T} (:: Type{X} , y:: Y , :: Type{Z} ) where {T,X,Y,Z} = Make3 {T,Type{X},Y, Type{Z}} (X, y, Z)
82- Make {T} (x:: X , :: Type{Y} , :: Type{Z} ) where {T,X,Y,Z} = Make3 {T,X, Type{Y},Type{Z}} (x, Y, Z)
83- Make {T} (:: Type{X} , :: Type{Y} , :: Type{Z} ) where {T,X,Y,Z} = Make3 {T,Type{X},Type{Y},Type{Z}} (X, Y, Z)
84-
85- # for expliciteness (allows using Make3 instead of Make)
86- Make3 {T} (x:: X , y:: Y , z:: Z ) where {T,X,Y,Z} = Make3 {T,X, Y, Z } (x, y, z)
87- Make3 {T} (:: Type{X} , y:: Y , z:: Z ) where {T,X,Y,Z} = Make3 {T,Type{X},Y, Z } (X, y, z)
88- Make3 {T} (x:: X , :: Type{Y} , z:: Z ) where {T,X,Y,Z} = Make3 {T,X, Type{Y},Z } (x, Y, z)
89- Make3 {T} (:: Type{X} , :: Type{Y} , z:: Z ) where {T,X,Y,Z} = Make3 {T,Type{X},Type{Y},Z } (X, Y, z)
90- Make3 {T} (x:: X , y:: Y , :: Type{Z} ) where {T,X,Y,Z} = Make3 {T,X, Y, Type{Z}} (x, y, Z)
91- Make3 {T} (:: Type{X} , y:: Y , :: Type{Z} ) where {T,X,Y,Z} = Make3 {T,Type{X},Y, Type{Z}} (X, y, Z)
92- Make3 {T} (x:: X , :: Type{Y} , :: Type{Z} ) where {T,X,Y,Z} = Make3 {T,X, Type{Y},Type{Z}} (x, Y, Z)
93- Make3 {T} (:: Type{X} , :: Type{Y} , :: Type{Z} ) where {T,X,Y,Z} = Make3 {T,Type{X},Type{Y},Type{Z}} (X, Y, Z)
94-
95-
96- make (:: Type{T} , x:: X , y:: Y , z:: Z ) where {T,X,Y,Z} = Make3 {maketype(T, x, y, z)} (x, y, z)
97- make (:: Type{T} , :: Type{X} , y:: Y , z:: Z ) where {T,X,Y,Z} = Make3 {maketype(T, X, y, z)} (X, y, z)
98- make (:: Type{T} , x:: X , :: Type{Y} , z:: Z ) where {T,X,Y,Z} = Make3 {maketype(T, x, Y, z)} (x, Y, z)
99- make (:: Type{T} , :: Type{X} , :: Type{Y} , z:: Z ) where {T,X,Y,Z} = Make3 {maketype(T, X, Y, z)} (X, Y, z)
100- make (:: Type{T} , x:: X , y:: Y , :: Type{Z} ) where {T,X,Y,Z} = Make3 {maketype(T, x, y, Z)} (x, y, Z)
101- make (:: Type{T} , :: Type{X} , y:: Y , :: Type{Z} ) where {T,X,Y,Z} = Make3 {maketype(T, X, y, Z)} (X, y, Z)
102- make (:: Type{T} , x:: X , :: Type{Y} , :: Type{Z} ) where {T,X,Y,Z} = Make3 {maketype(T, x, Y, Z)} (x, Y, Z)
103- make (:: Type{T} , :: Type{X} , :: Type{Y} , :: Type{Z} ) where {T,X,Y,Z} = Make3 {maketype(T, X, Y, Z)} (X, Y, Z)
104-
105- # default
106- maketype (:: Type{T} , x, y, z) where {T} = T
107-
108- # deduce_type
109-
11050deduce_type (:: Type{T} , :: Type{X} , :: Type{Y} ) where {T,X,Y} = _deduce_type (T, Val (isconcretetype (T)), X, Y)
11151deduce_type (:: Type{T} , :: Type{X} ) where {T,X} = _deduce_type (T, Val (isconcretetype (T)), X)
11252
0 commit comments