github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/utils/lists/count.go (about) 1 package lists 2 3 import ( 4 "fmt" 5 "strconv" 6 "strings" 7 8 "github.com/lmorg/murex/lang/types" 9 ) 10 11 func Count(slice interface{}) (map[string]int, error) { 12 switch t := slice.(type) { 13 case []int: 14 return countInt(t), nil 15 case []float64: 16 return countFloat64(t), nil 17 case []string: 18 return countString(t), nil 19 case []bool: 20 return countBool(t), nil 21 case []interface{}: 22 return countInterface(t) 23 24 case [][]string: 25 slice := make([]string, len(t)) 26 for i := range t { 27 slice[i] = strings.Join(t[i], " ") 28 } 29 return countString(slice), nil 30 31 default: 32 return make(map[string]int), fmt.Errorf("data type '%T' not supported in lists.Count(). Please report this at https://github.com/lmorg/murex/issues", t) 33 } 34 } 35 36 func countInt(s []int) map[string]int { 37 m := make(map[string]int) 38 for _, i := range s { 39 m[strconv.Itoa(i)]++ 40 } 41 42 return m 43 } 44 45 func countFloat64(s []float64) map[string]int { 46 m := make(map[string]int) 47 for _, f := range s { 48 m[types.FloatToString(f)]++ 49 } 50 51 return m 52 } 53 54 func countString(s []string) map[string]int { 55 m := make(map[string]int) 56 for i := range s { 57 m[s[i]]++ 58 } 59 60 return m 61 } 62 63 func countBool(s []bool) map[string]int { 64 m := make(map[string]int) 65 for i := range s { 66 if s[i] { 67 m[types.TrueString]++ 68 } else { 69 m[types.FalseString]++ 70 } 71 } 72 73 return m 74 } 75 76 func countInterface(s []interface{}) (map[string]int, error) { 77 m := make(map[string]int) 78 for i := range s { 79 v, err := types.ConvertGoType(s[i], types.String) 80 if err != nil { 81 return make(map[string]int), err 82 } 83 m[v.(string)]++ 84 } 85 86 return m, nil 87 }