github.com/hirochachacha/plua@v0.0.0-20170217012138-c82f520cc725/object/object.go (about) 1 package object 2 3 import ( 4 "math" 5 "reflect" 6 7 "github.com/hirochachacha/plua/internal/limits" 8 ) 9 10 func Equal(x, y Value) bool { 11 switch x := x.(type) { 12 case GoFunction: 13 if y, ok := y.(GoFunction); ok { 14 return reflect.ValueOf(x).Pointer() == reflect.ValueOf(y).Pointer() 15 } 16 17 return false 18 case Integer: 19 if y, ok := y.(Number); ok { 20 iy := Integer(y) 21 return (x == iy && y == Number(iy)) 22 } 23 case Number: 24 if y, ok := y.(Integer); ok { 25 ix := Integer(x) 26 return (y == ix && x == Number(ix)) 27 } 28 } 29 30 return x == y 31 } 32 33 func Repr(val Value) string { 34 if val == nil { 35 return "nil" 36 } 37 38 return val.String() 39 } 40 41 func ToType(val Value) Type { 42 if val == nil { 43 return TNIL 44 } 45 46 return val.Type() 47 } 48 49 func ToInteger(val Value) (Integer, bool) { 50 switch val := val.(type) { 51 case Integer: 52 return val, true 53 case Number: 54 return numberToInteger(val) 55 case String: 56 return stringToInteger(val) 57 } 58 59 return 0, false 60 } 61 62 func ToNumber(val Value) (Number, bool) { 63 switch val := val.(type) { 64 case Integer: 65 return Number(val), true 66 case Number: 67 return val, true 68 case String: 69 return stringToNumber(val) 70 } 71 72 return 0, false 73 } 74 75 func ToString(val Value) (String, bool) { 76 switch val := val.(type) { 77 case String: 78 return val, true 79 case Integer: 80 return integerToString(val), true 81 case Number: 82 return numberToString(val), true 83 } 84 85 return "", false 86 } 87 88 func ToBoolean(val Value) Boolean { 89 switch val := val.(type) { 90 case nil: 91 return false 92 case Boolean: 93 return val 94 } 95 return true 96 } 97 98 func ToGoInt(val Value) (int, bool) { 99 i, ok := ToGoInt64(val) 100 101 if i > limits.MaxInt || i < limits.MinInt { 102 return int(i), false 103 } 104 105 return int(i), ok 106 } 107 108 func ToGoInt64(val Value) (int64, bool) { 109 i, ok := ToInteger(val) 110 return int64(i), ok 111 } 112 113 func ToGoFloat64(val Value) (float64, bool) { 114 f, ok := ToNumber(val) 115 return float64(f), ok 116 } 117 118 func ToGoString(val Value) (string, bool) { 119 s, ok := ToString(val) 120 return string(s), ok 121 } 122 123 func ToGoBool(val Value) bool { 124 return bool(ToBoolean(val)) 125 } 126 127 func IsNaN(val Value) bool { 128 if val, ok := val.(Number); ok { 129 return math.IsNaN(float64(val)) 130 } 131 return false 132 }