github.com/m4gshm/gollections@v0.0.13-0.20240331203319-a34a86e58a24/convert/api.go (about)

     1  // Package convert provides converting helpers
     2  package convert
     3  
     4  import (
     5  	"github.com/m4gshm/gollections/c"
     6  	"github.com/m4gshm/gollections/k"
     7  )
     8  
     9  // AsIs helper for Map, Flatt
    10  func AsIs[T any](value T) T { return value }
    11  
    12  // And apply two converters in order.
    13  func And[I, O, N any](first func(I) O, second func(O) N) func(I) N {
    14  	return func(i I) N { return second(first(i)) }
    15  }
    16  
    17  // Or applies first Converter, applies second Converter if the first returns zero.
    18  func Or[I, O comparable](first func(I) O, second func(I) O) func(I) O {
    19  	return func(i I) O {
    20  		c := first(i)
    21  		var no O
    22  		if no == c {
    23  			return second(i)
    24  		}
    25  		return c
    26  	}
    27  }
    28  
    29  // ToSlice convert an one element to a slice
    30  func ToSlice[T any](value T) []T { return []T{value} }
    31  
    32  // AsSlice convert an one element to a slice
    33  func AsSlice[T any](value T) []T { return ToSlice(value) }
    34  
    35  // KeyValue transforms one element to one key/value pair
    36  func KeyValue[T, K, V any](element T, keyExtractor func(T) K, valExtractor func(T) V) c.KV[K, V] {
    37  	return k.V(keyExtractor(element), valExtractor(element))
    38  }
    39  
    40  // KeysValues transforms one element to multiple key/value pairs slices
    41  func KeysValues[T, K, V any](element T, keysExtractor func(T) []K, valsExtractor func(T) []V) (out []c.KV[K, V]) {
    42  	var (
    43  		keys   = keysExtractor(element)
    44  		values = valsExtractor(element)
    45  		lv     = len(values)
    46  	)
    47  	if len(keys) == 0 {
    48  		var key K
    49  		for _, value := range values {
    50  			out = append(out, k.V(key, value))
    51  		}
    52  	} else {
    53  		for _, key := range keys {
    54  			if lv == 0 {
    55  				var value V
    56  				out = append(out, k.V(key, value))
    57  			} else {
    58  				for _, value := range values {
    59  					out = append(out, k.V(key, value))
    60  				}
    61  			}
    62  		}
    63  	}
    64  	return out
    65  }
    66  
    67  // ExtraVals transforms iterable elements to key/value iterator based on applying key, value extractor to the elements
    68  func ExtraVals[T, V any](element T, valsExtractor func(T) []V) (out []c.KV[T, V]) {
    69  	var (
    70  		key    = element
    71  		values = valsExtractor(element)
    72  		lv     = len(values)
    73  	)
    74  	if lv == 0 {
    75  		var value V
    76  		out = append(out, k.V(key, value))
    77  	} else {
    78  		for _, value := range values {
    79  			out = append(out, k.V(key, value))
    80  		}
    81  	}
    82  	return out
    83  }
    84  
    85  // ExtraKeys transforms iterable elements to key/value iterator based on applying key, value extractor to the elements
    86  func ExtraKeys[T, K any](element T, keysExtractor func(T) []K) (out []c.KV[K, T]) {
    87  	var (
    88  		keys  = keysExtractor(element)
    89  		value = element
    90  	)
    91  	if len(keys) == 0 {
    92  		var key K
    93  		out = append(out, k.V(key, value))
    94  	} else {
    95  		for _, key := range keys {
    96  			out = append(out, k.V(key, value))
    97  		}
    98  	}
    99  	return out
   100  }
   101  
   102  // Ptr converts a value to the value pointer
   103  func Ptr[T any](value T) *T {
   104  	return &value
   105  }
   106  
   107  // PtrVal returns a value referenced by the pointer or the zero value if the pointer is nil
   108  func PtrVal[T any](pointer *T) (t T) {
   109  	if pointer != nil {
   110  		t = *pointer
   111  	}
   112  	return t
   113  }
   114  
   115  // NoNilPtrVal returns a value referenced by the pointer or ok==false if the pointer is nil
   116  func NoNilPtrVal[T any](pointer *T) (t T, ok bool) {
   117  	if pointer != nil {
   118  		return *pointer, true
   119  	}
   120  	return t, false
   121  }