Files
monkey/internal/ops/ops.go
Chuck Smith f08b458325
Some checks failed
Build / build (push) Successful in 10m47s
Publish Image / publish (push) Failing after 33s
Test / build (push) Failing after 6m42s
optimizations
2024-04-02 14:54:08 -04:00

129 lines
2.4 KiB
Go

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, "%")
}
}