// Match attempts to match the internal constant representations of x and y. // If the attempt is successful, the result is the values of x and y, // if necessary converted to have the same internal representation; otherwise // the results are invalid. func (x Const) Match(y Const) (u, v Const) { switch a := x.val.(type) { case bool: if _, ok := y.val.(bool); ok { u, v = x, y } case *big.Int: switch y.val.(type) { case *big.Int: u, v = x, y case *big.Rat: var z big.Rat z.SetInt(a) u, v = Const{&z}, y case cmplx: var z big.Rat z.SetInt(a) u, v = Const{cmplx{&z, big.NewRat(0, 1)}}, y } case *big.Rat: switch y.val.(type) { case *big.Int: v, u = y.Match(x) case *big.Rat: u, v = x, y case cmplx: u, v = Const{cmplx{a, big.NewRat(0, 0)}}, y } case cmplx: switch y.val.(type) { case *big.Int, *big.Rat: v, u = y.Match(x) case cmplx: u, v = x, y } case string: if _, ok := y.val.(string); ok { u, v = x, y } default: panic("unreachable") } return }