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  }