github.com/egonelbre/exp@v0.0.0-20240430123955-ed1d3aa93911/fields/00_typeswitch/ops.go (about) 1 package main 2 3 //gistsnip:start:ops 4 func Add(a, b Field) Field { 5 if aerr, ok := a.(*Error); ok { 6 return aerr 7 } 8 if berr, ok := b.(*Error); ok { 9 return berr 10 } 11 12 switch x := a.(type) { 13 case *Float: 14 if y, ok := b.(*Float); ok { 15 return x.Add(y) 16 } else { 17 return &Error{"add type-mismatch"} 18 } 19 case *Uint: 20 if y, ok := b.(*Uint); ok { 21 return x.Add(y) 22 } else { 23 return &Error{"add type-mismatch"} 24 } 25 default: 26 return &Error{"unhandled types"} 27 } 28 } 29 30 //gistsnip:end:ops 31 32 func Sub(a, b Field) Field { 33 if aerr, ok := a.(*Error); ok { 34 return aerr 35 } 36 if berr, ok := b.(*Error); ok { 37 return berr 38 } 39 40 switch x := a.(type) { 41 case *Float: 42 if y, ok := b.(*Float); ok { 43 return x.Sub(y) 44 } else { 45 return &Error{"add type-mismatch"} 46 } 47 case *Uint: 48 if y, ok := b.(*Uint); ok { 49 return x.Sub(y) 50 } else { 51 return &Error{"add type-mismatch"} 52 } 53 default: 54 return &Error{"unhandled types"} 55 } 56 }