github.com/angenalZZZ/gofunc@v0.0.0-20210507121333-48ff1be3917b/f/numerics.go (about)

     1  package f
     2  
     3  import (
     4  	"math"
     5  	"reflect"
     6  )
     7  
     8  // Abs returns absolute value of number
     9  func Abs(value float64) float64 {
    10  	return math.Abs(value)
    11  }
    12  
    13  // Sign returns sign of number: 1 in case of value > 0, -1 in case of value < 0, 0 otherwise
    14  func Sign(value float64) float64 {
    15  	if value > 0 {
    16  		return 1
    17  	} else if value < 0 {
    18  		return -1
    19  	} else {
    20  		return 0
    21  	}
    22  }
    23  
    24  // IsNegative returns true if value < 0
    25  func IsNegative(value float64) bool {
    26  	return value < 0
    27  }
    28  
    29  // IsPositive returns true if value > 0
    30  func IsPositive(value float64) bool {
    31  	return value > 0
    32  }
    33  
    34  // IsNonNegative returns true if value >= 0
    35  func IsNonNegative(value float64) bool {
    36  	return value >= 0
    37  }
    38  
    39  // IsNonPositive returns true if value <= 0
    40  func IsNonPositive(value float64) bool {
    41  	return value <= 0
    42  }
    43  
    44  // InRange returns true if value lies between left and right border
    45  func InRangeInt(value, left, right interface{}) bool {
    46  	value64, _ := ToInt(value)
    47  	left64, _ := ToInt(left)
    48  	right64, _ := ToInt(right)
    49  	if left64 > right64 {
    50  		left64, right64 = right64, left64
    51  	}
    52  	return value64 >= left64 && value64 <= right64
    53  }
    54  
    55  // InRange returns true if value lies between left and right border
    56  func InRangeFloat32(value, left, right float32) bool {
    57  	if left > right {
    58  		left, right = right, left
    59  	}
    60  	return value >= left && value <= right
    61  }
    62  
    63  // InRange returns true if value lies between left and right border
    64  func InRangeFloat64(value, left, right float64) bool {
    65  	if left > right {
    66  		left, right = right, left
    67  	}
    68  	return value >= left && value <= right
    69  }
    70  
    71  // InRange returns true if value lies between left and right border, generic type to handle int, float32 or float64, all types must the same type
    72  func InRange(value interface{}, left interface{}, right interface{}) bool {
    73  	reflectValue := reflect.TypeOf(value).Kind()
    74  	reflectLeft := reflect.TypeOf(left).Kind()
    75  	reflectRight := reflect.TypeOf(right).Kind()
    76  
    77  	if reflectValue == reflect.Int && reflectLeft == reflect.Int && reflectRight == reflect.Int {
    78  		return InRangeInt(value.(int), left.(int), right.(int))
    79  	} else if reflectValue == reflect.Float32 && reflectLeft == reflect.Float32 && reflectRight == reflect.Float32 {
    80  		return InRangeFloat32(value.(float32), left.(float32), right.(float32))
    81  	} else if reflectValue == reflect.Float64 && reflectLeft == reflect.Float64 && reflectRight == reflect.Float64 {
    82  		return InRangeFloat64(value.(float64), left.(float64), right.(float64))
    83  	} else {
    84  		return false
    85  	}
    86  }
    87  
    88  // IsWhole returns true if value is whole number
    89  func IsWhole(value float64) bool {
    90  	return math.Remainder(value, 1) == 0
    91  }
    92  
    93  // IsNatural returns true if value is natural number (positive and whole)
    94  func IsNatural(value float64) bool {
    95  	return IsWhole(value) && IsPositive(value)
    96  }