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  }