1pub trait OptionTy {
3 const EXISTS: bool;
5}
6
7impl OptionTy for NoneTy {
8 const EXISTS: bool = false;
9}
10
11impl<T> OptionTy for SomeTy<T> {
12 const EXISTS: bool = true;
13}
14pub struct NoneTy;
16
17pub struct SomeTy<T>(pub T);
19
20pub struct SampleParams<B: OptionTy, L: OptionTy, G: OptionTy, S: OptionTy> {
25 pub bias: B,
27
28 pub lod: L,
30
31 pub grad: G,
33
34 pub sample_index: S,
36}
37
38pub fn bias<B>(bias: B) -> SampleParams<SomeTy<B>, NoneTy, NoneTy, NoneTy> {
40 SampleParams {
41 bias: SomeTy(bias),
42 lod: NoneTy,
43 grad: NoneTy,
44 sample_index: NoneTy,
45 }
46}
47
48pub fn lod<L>(lod: L) -> SampleParams<NoneTy, SomeTy<L>, NoneTy, NoneTy> {
50 SampleParams {
51 bias: NoneTy,
52 lod: SomeTy(lod),
53 grad: NoneTy,
54 sample_index: NoneTy,
55 }
56}
57
58pub fn grad<T>(grad_x: T, grad_y: T) -> SampleParams<NoneTy, NoneTy, SomeTy<(T, T)>, NoneTy> {
60 SampleParams {
61 bias: NoneTy,
62 lod: NoneTy,
63 grad: SomeTy((grad_x, grad_y)),
64 sample_index: NoneTy,
65 }
66}
67
68pub fn sample_index<S>(sample_index: S) -> SampleParams<NoneTy, NoneTy, NoneTy, SomeTy<S>> {
70 SampleParams {
71 bias: NoneTy,
72 lod: NoneTy,
73 grad: NoneTy,
74 sample_index: SomeTy(sample_index),
75 }
76}
77
78impl<L: OptionTy, G: OptionTy, S: OptionTy> SampleParams<NoneTy, L, G, S> {
79 pub fn bias<B>(self, bias: B) -> SampleParams<SomeTy<B>, L, G, S> {
81 SampleParams {
82 bias: SomeTy(bias),
83 lod: self.lod,
84 grad: self.grad,
85 sample_index: self.sample_index,
86 }
87 }
88}
89
90impl<B: OptionTy, G: OptionTy, S: OptionTy> SampleParams<B, NoneTy, G, S> {
91 pub fn lod<L>(self, lod: L) -> SampleParams<B, SomeTy<L>, G, S> {
93 SampleParams {
94 bias: self.bias,
95 lod: SomeTy(lod),
96 grad: self.grad,
97 sample_index: self.sample_index,
98 }
99 }
100}
101
102impl<B: OptionTy, L: OptionTy, S: OptionTy> SampleParams<B, L, NoneTy, S> {
103 pub fn grad<T>(self, grad_x: T, grad_y: T) -> SampleParams<B, L, SomeTy<(T, T)>, S> {
105 SampleParams {
106 bias: self.bias,
107 lod: self.lod,
108 grad: SomeTy((grad_x, grad_y)),
109 sample_index: self.sample_index,
110 }
111 }
112}
113
114impl<B: OptionTy, L: OptionTy, G: OptionTy> SampleParams<B, L, G, NoneTy> {
115 pub fn sample_index<S>(self, sample_index: S) -> SampleParams<B, L, G, SomeTy<S>> {
117 SampleParams {
118 bias: self.bias,
119 lod: self.lod,
120 grad: self.grad,
121 sample_index: SomeTy(sample_index),
122 }
123 }
124}