@@ -65,9 +65,11 @@ pub enum BuiltinFn<Expr> {
65
65
IsModuleInput ( String , Loc ) ,
66
66
Ln ( Box < Expr > ) ,
67
67
Log10 ( Box < Expr > ) ,
68
- Max ( Box < Expr > , Box < Expr > ) ,
68
+ // max takes 2 scalar args OR 1-2 args for an array
69
+ Max ( Box < Expr > , Option < Box < Expr > > ) ,
69
70
Mean ( Vec < Expr > ) ,
70
- Min ( Box < Expr > , Box < Expr > ) ,
71
+ // max takes 2 scalar args OR 1-2 args for an array
72
+ Min ( Box < Expr > , Option < Box < Expr > > ) ,
71
73
Pi ,
72
74
Pulse ( Box < Expr > , Box < Expr > , Option < Box < Expr > > ) ,
73
75
Ramp ( Box < Expr > , Box < Expr > , Option < Box < Expr > > ) ,
@@ -80,38 +82,49 @@ pub enum BuiltinFn<Expr> {
80
82
TimeStep ,
81
83
StartTime ,
82
84
FinalTime ,
85
+ // array-only builtins
86
+ Rank ( Box < Expr > , Option < ( Box < Expr > , Option < Box < Expr > > ) > ) ,
87
+ Size ( Box < Expr > ) ,
88
+ Stddev ( Box < Expr > ) ,
89
+ Sum ( Box < Expr > ) ,
83
90
}
84
91
85
92
impl < Expr > BuiltinFn < Expr > {
86
93
pub fn name ( & self ) -> & ' static str {
94
+ use BuiltinFn :: * ;
87
95
match self {
88
- BuiltinFn :: Lookup ( _, _, _) => "lookup" ,
89
- BuiltinFn :: Abs ( _) => "abs" ,
90
- BuiltinFn :: Arccos ( _) => "arccos" ,
91
- BuiltinFn :: Arcsin ( _) => "arcsin" ,
92
- BuiltinFn :: Arctan ( _) => "arctan" ,
93
- BuiltinFn :: Cos ( _) => "cos" ,
94
- BuiltinFn :: Exp ( _) => "exp" ,
95
- BuiltinFn :: Inf => "inf" ,
96
- BuiltinFn :: Int ( _) => "int" ,
97
- BuiltinFn :: IsModuleInput ( _, _) => "ismoduleinput" ,
98
- BuiltinFn :: Ln ( _) => "ln" ,
99
- BuiltinFn :: Log10 ( _) => "log10" ,
100
- BuiltinFn :: Max ( _, _) => "max" ,
101
- BuiltinFn :: Mean ( _) => "mean" ,
102
- BuiltinFn :: Min ( _, _) => "min" ,
103
- BuiltinFn :: Pi => "pi" ,
104
- BuiltinFn :: Pulse ( _, _, _) => "pulse" ,
105
- BuiltinFn :: Ramp ( _, _, _) => "ramp" ,
106
- BuiltinFn :: SafeDiv ( _, _, _) => "safediv" ,
107
- BuiltinFn :: Sin ( _) => "sin" ,
108
- BuiltinFn :: Sqrt ( _) => "sqrt" ,
109
- BuiltinFn :: Step ( _, _) => "step" ,
110
- BuiltinFn :: Tan ( _) => "tan" ,
111
- BuiltinFn :: Time => "time" ,
112
- BuiltinFn :: TimeStep => "time_step" ,
113
- BuiltinFn :: StartTime => "initial_time" ,
114
- BuiltinFn :: FinalTime => "final_time" ,
96
+ Lookup ( _, _, _) => "lookup" ,
97
+ Abs ( _) => "abs" ,
98
+ Arccos ( _) => "arccos" ,
99
+ Arcsin ( _) => "arcsin" ,
100
+ Arctan ( _) => "arctan" ,
101
+ Cos ( _) => "cos" ,
102
+ Exp ( _) => "exp" ,
103
+ Inf => "inf" ,
104
+ Int ( _) => "int" ,
105
+ IsModuleInput ( _, _) => "ismoduleinput" ,
106
+ Ln ( _) => "ln" ,
107
+ Log10 ( _) => "log10" ,
108
+ Max ( _, _) => "max" ,
109
+ Mean ( _) => "mean" ,
110
+ Min ( _, _) => "min" ,
111
+ Pi => "pi" ,
112
+ Pulse ( _, _, _) => "pulse" ,
113
+ Ramp ( _, _, _) => "ramp" ,
114
+ SafeDiv ( _, _, _) => "safediv" ,
115
+ Sin ( _) => "sin" ,
116
+ Sqrt ( _) => "sqrt" ,
117
+ Step ( _, _) => "step" ,
118
+ Tan ( _) => "tan" ,
119
+ Time => "time" ,
120
+ TimeStep => "time_step" ,
121
+ StartTime => "initial_time" ,
122
+ FinalTime => "final_time" ,
123
+ // array only builtins
124
+ Rank ( _, _) => "rank" ,
125
+ Size ( _) => "size" ,
126
+ Stddev ( _) => "stddev" ,
127
+ Sum ( _) => "sum" ,
115
128
}
116
129
}
117
130
}
@@ -127,27 +140,33 @@ pub fn is_builtin_fn(name: &str) -> bool {
127
140
is_0_arity_builtin_fn ( name)
128
141
|| matches ! (
129
142
name,
143
+ // scalar builtins
130
144
"lookup"
131
- | "abs"
132
- | "arccos"
133
- | "arcsin"
134
- | "arctan"
135
- | "cos"
136
- | "exp"
137
- | "int"
138
- | "ismoduleinput"
139
- | "ln"
140
- | "log10"
141
- | "max"
142
- | "mean"
143
- | "min"
144
- | "pulse"
145
- | "ramp"
146
- | "safediv"
147
- | "sin"
148
- | "sqrt"
149
- | "step"
150
- | "tan"
145
+ | "abs"
146
+ | "arccos"
147
+ | "arcsin"
148
+ | "arctan"
149
+ | "cos"
150
+ | "exp"
151
+ | "int"
152
+ | "ismoduleinput"
153
+ | "ln"
154
+ | "log10"
155
+ | "max"
156
+ | "mean"
157
+ | "min"
158
+ | "pulse"
159
+ | "ramp"
160
+ | "safediv"
161
+ | "sin"
162
+ | "sqrt"
163
+ | "step"
164
+ | "tan"
165
+ // array-only builtins
166
+ | "rank"
167
+ | "size"
168
+ | "stddev"
169
+ | "sum"
151
170
)
152
171
}
153
172
@@ -183,21 +202,39 @@ where
183
202
| BuiltinFn :: Log10 ( a)
184
203
| BuiltinFn :: Sin ( a)
185
204
| BuiltinFn :: Sqrt ( a)
186
- | BuiltinFn :: Tan ( a) => cb ( BuiltinContents :: Expr ( a) ) ,
205
+ | BuiltinFn :: Tan ( a)
206
+ | BuiltinFn :: Size ( a)
207
+ | BuiltinFn :: Stddev ( a)
208
+ | BuiltinFn :: Sum ( a) => cb ( BuiltinContents :: Expr ( a) ) ,
187
209
BuiltinFn :: Mean ( args) => {
188
210
args. iter ( ) . for_each ( |a| cb ( BuiltinContents :: Expr ( a) ) ) ;
189
211
}
190
- BuiltinFn :: Max ( a , b ) | BuiltinFn :: Min ( a , b ) | BuiltinFn :: Step ( a, b) => {
212
+ BuiltinFn :: Step ( a, b) => {
191
213
cb ( BuiltinContents :: Expr ( a) ) ;
192
214
cb ( BuiltinContents :: Expr ( b) ) ;
193
215
}
216
+ BuiltinFn :: Max ( a, b) | BuiltinFn :: Min ( a, b) => {
217
+ cb ( BuiltinContents :: Expr ( a) ) ;
218
+ if let Some ( b) = b {
219
+ cb ( BuiltinContents :: Expr ( b) ) ;
220
+ }
221
+ }
194
222
BuiltinFn :: Pulse ( a, b, c) | BuiltinFn :: Ramp ( a, b, c) | BuiltinFn :: SafeDiv ( a, b, c) => {
195
223
cb ( BuiltinContents :: Expr ( a) ) ;
196
224
cb ( BuiltinContents :: Expr ( b) ) ;
197
225
if let Some ( c) = c {
198
226
cb ( BuiltinContents :: Expr ( c) )
199
227
}
200
228
}
229
+ BuiltinFn :: Rank ( a, rest) => {
230
+ cb ( BuiltinContents :: Expr ( a) ) ;
231
+ if let Some ( ( b, c) ) = rest {
232
+ cb ( BuiltinContents :: Expr ( b) ) ;
233
+ if let Some ( c) = c {
234
+ cb ( BuiltinContents :: Expr ( c) ) ;
235
+ }
236
+ }
237
+ }
201
238
}
202
239
}
203
240
@@ -206,6 +243,10 @@ fn test_is_builtin_fn() {
206
243
assert ! ( is_builtin_fn( "lookup" ) ) ;
207
244
assert ! ( !is_builtin_fn( "lookupz" ) ) ;
208
245
assert ! ( is_builtin_fn( "log10" ) ) ;
246
+ assert ! ( is_builtin_fn( "sum" ) ) ;
247
+ assert ! ( is_builtin_fn( "rank" ) ) ;
248
+ assert ! ( is_builtin_fn( "size" ) ) ;
249
+ assert ! ( is_builtin_fn( "stddev" ) ) ;
209
250
}
210
251
211
252
#[ test]
0 commit comments