1#![allow(clippy::many_single_char_names)]
2
3use crate::impl_::dep::Dep;
4
5pub struct Lambda<FN> {
6 f: FN,
7 deps: Vec<Dep>,
8}
9
10pub fn lambda1_deps<A, B, FN: IsLambda1<A, B>>(f: &FN) -> Vec<Dep> {
11 f.deps_op().cloned().unwrap_or_default()
12}
13
14pub fn lambda2_deps<A, B, C, FN: IsLambda2<A, B, C>>(f: &FN) -> Vec<Dep> {
15 f.deps_op().cloned().unwrap_or_default()
16}
17
18pub fn lambda3_deps<A, B, C, D, FN: IsLambda3<A, B, C, D>>(f: &FN) -> Vec<Dep> {
19 f.deps_op().cloned().unwrap_or_default()
20}
21
22pub fn lambda4_deps<A, B, C, D, E, FN: IsLambda4<A, B, C, D, E>>(f: &FN) -> Vec<Dep> {
23 f.deps_op().cloned().unwrap_or_default()
24}
25
26pub fn lambda5_deps<A, B, C, D, E, F, FN: IsLambda5<A, B, C, D, E, F>>(f: &FN) -> Vec<Dep> {
27 f.deps_op().cloned().unwrap_or_default()
28}
29
30pub fn lambda6_deps<A, B, C, D, E, F, G, FN: IsLambda6<A, B, C, D, E, F, G>>(f: &FN) -> Vec<Dep> {
31 f.deps_op().cloned().unwrap_or_default()
32}
33
34pub trait IsLambda1<A, B> {
36 fn call(&mut self, a: &A) -> B;
37 fn deps_op(&self) -> Option<&Vec<Dep>>;
38}
39
40pub trait IsLambda2<A, B, C> {
42 fn call(&mut self, a: &A, b: &B) -> C;
43 fn deps_op(&self) -> Option<&Vec<Dep>>;
44}
45
46pub trait IsLambda3<A, B, C, D> {
48 fn call(&mut self, a: &A, b: &B, c: &C) -> D;
49 fn deps_op(&self) -> Option<&Vec<Dep>>;
50}
51
52pub trait IsLambda4<A, B, C, D, E> {
54 fn call(&mut self, a: &A, b: &B, c: &C, d: &D) -> E;
55 fn deps_op(&self) -> Option<&Vec<Dep>>;
56}
57
58pub trait IsLambda5<A, B, C, D, E, F> {
60 fn call(&mut self, a: &A, b: &B, c: &C, d: &D, e: &E) -> F;
61 fn deps_op(&self) -> Option<&Vec<Dep>>;
62}
63
64pub trait IsLambda6<A, B, C, D, E, F, G> {
66 fn call(&mut self, a: &A, b: &B, c: &C, d: &D, e: &E, f: &F) -> G;
67 fn deps_op(&self) -> Option<&Vec<Dep>>;
68}
69
70impl<A, B, FN: FnMut(&A) -> B> IsLambda1<A, B> for Lambda<FN> {
71 fn call(&mut self, a: &A) -> B {
72 (self.f)(a)
73 }
74
75 fn deps_op(&self) -> Option<&Vec<Dep>> {
76 Some(&self.deps)
77 }
78}
79
80impl<A, B, FN: FnMut(&A) -> B> IsLambda1<A, B> for FN {
81 fn call(&mut self, a: &A) -> B {
82 self(a)
83 }
84
85 fn deps_op(&self) -> Option<&Vec<Dep>> {
86 None
87 }
88}
89
90impl<A, B, C, FN: FnMut(&A, &B) -> C> IsLambda2<A, B, C> for Lambda<FN> {
91 fn call(&mut self, a: &A, b: &B) -> C {
92 (self.f)(a, b)
93 }
94
95 fn deps_op(&self) -> Option<&Vec<Dep>> {
96 Some(&self.deps)
97 }
98}
99
100impl<A, B, C, FN: FnMut(&A, &B) -> C> IsLambda2<A, B, C> for FN {
101 fn call(&mut self, a: &A, b: &B) -> C {
102 self(a, b)
103 }
104
105 fn deps_op(&self) -> Option<&Vec<Dep>> {
106 None
107 }
108}
109
110impl<A, B, C, D, FN: FnMut(&A, &B, &C) -> D> IsLambda3<A, B, C, D> for Lambda<FN> {
111 fn call(&mut self, a: &A, b: &B, c: &C) -> D {
112 (self.f)(a, b, c)
113 }
114
115 fn deps_op(&self) -> Option<&Vec<Dep>> {
116 Some(&self.deps)
117 }
118}
119
120impl<A, B, C, D, FN: FnMut(&A, &B, &C) -> D> IsLambda3<A, B, C, D> for FN {
121 fn call(&mut self, a: &A, b: &B, c: &C) -> D {
122 self(a, b, c)
123 }
124
125 fn deps_op(&self) -> Option<&Vec<Dep>> {
126 None
127 }
128}
129
130impl<A, B, C, D, E, FN: FnMut(&A, &B, &C, &D) -> E> IsLambda4<A, B, C, D, E> for Lambda<FN> {
131 fn call(&mut self, a: &A, b: &B, c: &C, d: &D) -> E {
132 (self.f)(a, b, c, d)
133 }
134
135 fn deps_op(&self) -> Option<&Vec<Dep>> {
136 Some(&self.deps)
137 }
138}
139
140impl<A, B, C, D, E, FN: FnMut(&A, &B, &C, &D) -> E> IsLambda4<A, B, C, D, E> for FN {
141 fn call(&mut self, a: &A, b: &B, c: &C, d: &D) -> E {
142 self(a, b, c, d)
143 }
144
145 fn deps_op(&self) -> Option<&Vec<Dep>> {
146 None
147 }
148}
149
150impl<A, B, C, D, E, F, FN: FnMut(&A, &B, &C, &D, &E) -> F> IsLambda5<A, B, C, D, E, F>
151 for Lambda<FN>
152{
153 fn call(&mut self, a: &A, b: &B, c: &C, d: &D, e: &E) -> F {
154 (self.f)(a, b, c, d, e)
155 }
156
157 fn deps_op(&self) -> Option<&Vec<Dep>> {
158 Some(&self.deps)
159 }
160}
161
162impl<A, B, C, D, E, F, FN: FnMut(&A, &B, &C, &D, &E) -> F> IsLambda5<A, B, C, D, E, F> for FN {
163 fn call(&mut self, a: &A, b: &B, c: &C, d: &D, e: &E) -> F {
164 self(a, b, c, d, e)
165 }
166
167 fn deps_op(&self) -> Option<&Vec<Dep>> {
168 None
169 }
170}
171
172impl<A, B, C, D, E, F, G, FN: FnMut(&A, &B, &C, &D, &E, &F) -> G> IsLambda6<A, B, C, D, E, F, G>
173 for Lambda<FN>
174{
175 fn call(&mut self, a: &A, b: &B, c: &C, d: &D, e: &E, f: &F) -> G {
176 (self.f)(a, b, c, d, e, f)
177 }
178
179 fn deps_op(&self) -> Option<&Vec<Dep>> {
180 Some(&self.deps)
181 }
182}
183
184impl<A, B, C, D, E, F, G, FN: FnMut(&A, &B, &C, &D, &E, &F) -> G> IsLambda6<A, B, C, D, E, F, G>
185 for FN
186{
187 fn call(&mut self, a: &A, b: &B, c: &C, d: &D, e: &E, f: &F) -> G {
188 self(a, b, c, d, e, f)
189 }
190
191 fn deps_op(&self) -> Option<&Vec<Dep>> {
192 None
193 }
194}
195
196pub fn lambda1<A, B, FN: FnMut(&A) -> B>(f: FN, deps: Vec<Dep>) -> Lambda<FN> {
197 Lambda { f, deps }
198}
199
200pub fn lambda2<A, B, C, FN: FnMut(&A, &B) -> C>(f: FN, deps: Vec<Dep>) -> Lambda<FN> {
201 Lambda { f, deps }
202}
203
204pub fn lambda3<A, B, C, D, FN: FnMut(&A, &B, &C) -> D>(f: FN, deps: Vec<Dep>) -> Lambda<FN> {
205 Lambda { f, deps }
206}
207
208pub fn lambda4<A, B, C, D, E, FN: FnMut(&A, &B, &C, &D) -> E>(f: FN, deps: Vec<Dep>) -> Lambda<FN> {
209 Lambda { f, deps }
210}
211
212pub fn lambda5<A, B, C, D, E, F, FN: FnMut(&A, &B, &C, &D, &E) -> F>(
213 f: FN,
214 deps: Vec<Dep>,
215) -> Lambda<FN> {
216 Lambda { f, deps }
217}
218
219pub fn lambda6<A, B, C, D, E, F, G, FN: FnMut(&A, &B, &C, &D, &E, &F) -> G>(
220 f: FN,
221 deps: Vec<Dep>,
222) -> Lambda<FN> {
223 Lambda { f, deps }
224}