@@ -65,9 +65,11 @@ pub enum BuiltinFn<Expr> {
6565 IsModuleInput ( String , Loc ) ,
6666 Ln ( Box < Expr > ) ,
6767 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 > > ) ,
6970 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 > > ) ,
7173 Pi ,
7274 Pulse ( Box < Expr > , Box < Expr > , Option < Box < Expr > > ) ,
7375 Ramp ( Box < Expr > , Box < Expr > , Option < Box < Expr > > ) ,
@@ -80,38 +82,49 @@ pub enum BuiltinFn<Expr> {
8082 TimeStep ,
8183 StartTime ,
8284 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 > ) ,
8390}
8491
8592impl < Expr > BuiltinFn < Expr > {
8693 pub fn name ( & self ) -> & ' static str {
94+ use BuiltinFn :: * ;
8795 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" ,
115128 }
116129 }
117130}
@@ -127,27 +140,33 @@ pub fn is_builtin_fn(name: &str) -> bool {
127140 is_0_arity_builtin_fn ( name)
128141 || matches ! (
129142 name,
143+ // scalar builtins
130144 "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"
151170 )
152171}
153172
@@ -183,14 +202,23 @@ where
183202 | BuiltinFn :: Log10 ( a)
184203 | BuiltinFn :: Sin ( a)
185204 | 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) ) ,
187209 BuiltinFn :: Mean ( args) => {
188210 args. iter ( ) . for_each ( |a| cb ( BuiltinContents :: Expr ( a) ) ) ;
189211 }
190- BuiltinFn :: Max ( a , b ) | BuiltinFn :: Min ( a , b ) | BuiltinFn :: Step ( a, b) => {
212+ BuiltinFn :: Step ( a, b) => {
191213 cb ( BuiltinContents :: Expr ( a) ) ;
192214 cb ( BuiltinContents :: Expr ( b) ) ;
193215 }
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+ }
194222 BuiltinFn :: Pulse ( a, b, c) | BuiltinFn :: Ramp ( a, b, c) | BuiltinFn :: SafeDiv ( a, b, c) => {
195223 cb ( BuiltinContents :: Expr ( a) ) ;
196224 cb ( BuiltinContents :: Expr ( b) ) ;
@@ -199,6 +227,15 @@ where
199227 None => { }
200228 }
201229 }
230+ BuiltinFn :: Rank ( a, rest) => {
231+ cb ( BuiltinContents :: Expr ( a) ) ;
232+ if let Some ( ( b, c) ) = rest {
233+ cb ( BuiltinContents :: Expr ( b) ) ;
234+ if let Some ( c) = c {
235+ cb ( BuiltinContents :: Expr ( c) ) ;
236+ }
237+ }
238+ }
202239 }
203240}
204241
@@ -207,6 +244,10 @@ fn test_is_builtin_fn() {
207244 assert ! ( is_builtin_fn( "lookup" ) ) ;
208245 assert ! ( !is_builtin_fn( "lookupz" ) ) ;
209246 assert ! ( is_builtin_fn( "log10" ) ) ;
247+ assert ! ( is_builtin_fn( "sum" ) ) ;
248+ assert ! ( is_builtin_fn( "rank" ) ) ;
249+ assert ! ( is_builtin_fn( "size" ) ) ;
250+ assert ! ( is_builtin_fn( "stddev" ) ) ;
210251}
211252
212253#[ test]
0 commit comments