package ops import "monkey/internal/object" func Add(left, right object.Object) (object.Object, error) { switch obj := left.(type) { case object.Integer: val, err := obj.Add(right) if err != nil { return nil, err } return val, nil case object.Float: val, err := obj.Add(right) if err != nil { return nil, err } return val, err case object.String: val, err := obj.Add(right) if err != nil { return nil, err } return val, nil case *object.Array: val, err := obj.Add(right) if err != nil { return nil, err } return val, nil case *object.Hash: val, err := obj.Add(right) if err != nil { return nil, err } return val, nil default: return nil, object.NewBinaryOpError(left, right, "+") } } func Sub(left, right object.Object) (object.Object, error) { switch obj := left.(type) { case object.Integer: val, err := obj.Sub(right) if err != nil { return nil, err } return val, nil case object.Float: val, err := obj.Sub(right) if err != nil { return nil, err } return val, nil default: return nil, object.NewBinaryOpError(left, right, "-") } } func Mul(left, right object.Object) (object.Object, error) { switch obj := left.(type) { case *object.Array: val, err := obj.Mul(right) if err != nil { return nil, err } return val, nil case object.Integer: val, err := obj.Mul(right) if err != nil { return nil, err } return val, nil case object.Float: val, err := obj.Mul(right) if err != nil { return nil, err } return val, nil case object.String: val, err := obj.Mul(right) if err != nil { return nil, err } return val, nil default: return nil, object.NewBinaryOpError(left, right, "*") } } func Div(left, right object.Object) (object.Object, error) { switch obj := left.(type) { case object.Integer: val, err := obj.Div(right) if err != nil { return nil, err } return val, nil case object.Float: val, err := obj.Div(right) if err != nil { return nil, err } return val, nil default: return nil, object.NewBinaryOpError(left, right, "/") } } func Mod(left, right object.Object) (object.Object, error) { switch obj := left.(type) { case object.Integer: val, err := obj.Mod(right) if err != nil { return nil, err } return val, nil case object.Float: val, err := obj.Mod(right) if err != nil { return nil, err } return val, nil default: return nil, object.NewBinaryOpError(left, right, "%") } }