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  }