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 }