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) } func (b Boolean) Clone() Object { return Boolean{Value: b.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 }