Files
monkey/internal/object/bool.go
csmith 99f7553d67
Some checks failed
Publish Image / publish (push) Waiting to run
Test / build (push) Waiting to run
Build / build (push) Has been cancelled
refactor objects
2024-04-01 17:34:10 -04:00

88 lines
1.4 KiB
Go

package object
import (
"fmt"
)
var (
TRUE = Boolean{Value: true}
FALSE = Boolean{Value: false}
)
type Boolean struct {
Value bool
}
func NewBoolean(value bool) Boolean {
if value {
return TRUE
}
return FALSE
}
func (b Boolean) Bool() bool {
return b.Value
}
func (b Boolean) Type() Type {
return BooleanType
}
func (b Boolean) Inspect() string {
return fmt.Sprintf("%t", b.Value)
}
// Copy implements the Copyable interface
func (b Boolean) Copy() Object {
return Boolean{Value: b.Value}
}
// Hash implements the Hasher interface
func (b Boolean) Hash() HashKey {
var value uint64
if b.Value {
value = 1
} else {
value = 0
}
return HashKey{Type: b.Type(), Value: value}
}
func (b Boolean) String() string {
return b.Inspect()
}
func (b Boolean) Int() int {
if b.Value {
return 1
}
return 0
}
func (b Boolean) LogicalAnd(other Object) (Object, error) {
if !AssertTypes(other, BooleanType, IntegerType) {
return nil, NewBinaryOpError(b, other, "&&")
}
return Boolean{b.Value && other.Bool()}, nil
}
func (b Boolean) LogicalOr(other Object) (Object, error) {
if !AssertTypes(other, BooleanType, IntegerType) {
return nil, NewBinaryOpError(b, other, "||")
}
return Boolean{b.Value || other.Bool()}, nil
}
func (b Boolean) LogicalNot() Object {
return Boolean{!b.Value}
}
func (b Boolean) Compare(other Object) int {
if obj, ok := other.(Boolean); ok {
return b.Int() - obj.Int()
}
return 1
}