@@ -272,27 +272,6 @@ type Number struct {
272272var _ Expression = Number {}
273273var _ Literal = Number {}
274274
275- func (n Number ) Equal (other Number ) bool {
276- // handle technically invalid numbers
277- if other .Value == nil || n .Value == nil {
278- return (other .Value == nil ) == (n .Value == nil )
279- }
280-
281- selfInt , selfOk := n .ToInteger ()
282- otherInt , otherOk := other .ToInteger ()
283-
284- // not the same type
285- if selfOk != otherOk {
286- return false
287- }
288-
289- if selfOk {
290- return otherInt == selfInt
291- }
292-
293- return n .ToFloat () == other .ToFloat ()
294- }
295-
296275func (n Number ) ToInteger () (int64 , bool ) {
297276 switch asserted := n .Value .(type ) {
298277 case int :
@@ -306,31 +285,32 @@ func (n Number) ToInteger() (int64, bool) {
306285 }
307286}
308287
309- func (n Number ) IsFloat () bool {
310- _ , ok := n .Value .(float64 )
311- return ok
312- }
313-
314- func (n Number ) ToFloat () float64 {
288+ func (n Number ) ToFloat () (float64 , bool ) {
315289 switch asserted := n .Value .(type ) {
316- case int :
317- return float64 (asserted )
318- case int32 :
319- return float64 (asserted )
320- case int64 :
321- return float64 (asserted )
322290 case float32 :
323- return float64 (asserted )
291+ return float64 (asserted ), true
324292 case float64 :
325- return asserted
293+ return asserted , true
326294 default :
327- panic ( fmt . Sprintf ( "Number with non-numeric value %v (%T)" , n . Value , n . Value ))
295+ return 0 , false
328296 }
329297}
330298
299+ func (n Number ) MustToFloat () float64 {
300+ if i , ok := n .ToInteger (); ok {
301+ return float64 (i )
302+ }
303+
304+ if f , ok := n .ToFloat (); ok {
305+ return f
306+ }
307+
308+ panic (fmt .Sprintf ("invalid number value %#v (%T)" , n .Value , n .Value ))
309+ }
310+
331311func (n Number ) String () string {
332- if n . IsFloat () {
333- return fmt .Sprintf ("%f" , n . Value )
312+ if f , ok := n . ToFloat (); ok {
313+ return fmt .Sprintf ("%f" , f )
334314 }
335315
336316 return fmt .Sprintf ("%d" , n .Value )
0 commit comments