| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- package slices
- import "reflect"
- type MapItem struct {
- Key, Elem interface{}
- }
- // Creates a []struct{Key K; Value V} for map[K]V.
- func FromMap(m interface{}) (slice []MapItem) {
- mapValue := reflect.ValueOf(m)
- for _, key := range mapValue.MapKeys() {
- slice = append(slice, MapItem{key.Interface(), mapValue.MapIndex(key).Interface()})
- }
- return
- }
- // Returns all the elements []T, from m where m is map[K]T.
- func FromMapElems(m interface{}) interface{} {
- inValue := reflect.ValueOf(m)
- outValue := reflect.MakeSlice(reflect.SliceOf(inValue.Type().Elem()), inValue.Len(), inValue.Len())
- for i, key := range inValue.MapKeys() {
- outValue.Index(i).Set(inValue.MapIndex(key))
- }
- return outValue.Interface()
- }
- // Returns all the elements []K, from m where m is map[K]T.
- func FromMapKeys(m interface{}) interface{} {
- inValue := reflect.ValueOf(m)
- outValue := reflect.MakeSlice(reflect.SliceOf(inValue.Type().Key()), inValue.Len(), inValue.Len())
- for i, key := range inValue.MapKeys() {
- outValue.Index(i).Set(key)
- }
- return outValue.Interface()
- }
- // f: (T)T, input: []T, outout: []T
- func Map(f, input interface{}) interface{} {
- inputValue := reflect.ValueOf(input)
- funcValue := reflect.ValueOf(f)
- _len := inputValue.Len()
- retValue := reflect.MakeSlice(reflect.TypeOf(input), _len, _len)
- for i := 0; i < _len; i++ {
- out := funcValue.Call([]reflect.Value{inputValue.Index(i)})
- retValue.Index(i).Set(out[0])
- }
- return retValue.Interface()
- }
|