1 package dara
2 3 import (
4 "math"
5 "math/rand"
6 "reflect"
7 "time"
8 )
9 10 // Number is an interface that can be implemented by any numeric type
11 type Number interface{}
12 13 // toFloat64 converts a numeric value to float64 for comparison
14 func toFloat64(n Number) float64 {
15 v := reflect.ValueOf(n)
16 switch v.Kind() {
17 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
18 return float64(v.Int())
19 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
20 return float64(v.Uint())
21 case reflect.Float32, reflect.Float64:
22 return v.Float()
23 default:
24 panic("unsupported type")
25 }
26 }
27 28 // Floor returns the largest integer less than or equal to the input number as int
29 func Floor(n Number) int {
30 v := toFloat64(n)
31 floorValue := math.Floor(v)
32 return int(floorValue)
33 }
34 35 // Round returns the nearest integer to the input number as int
36 func Round(n Number) int {
37 v := toFloat64(n)
38 roundValue := math.Round(v)
39 return int(roundValue)
40 }
41 42 func Random() float64 {
43 rand.Seed(time.Now().UnixNano())
44 return rand.Float64()
45 }
46