forked from tobyhede/go-underscore
/
map.go
69 lines (50 loc) · 1.21 KB
/
map.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package un
import (
"reflect"
)
func init() {
MakeMap(&Map)
MakeMap(&MapString)
MakeMap(&MapInt)
MakeMap(&MapStringToBool)
}
/**
Map func([]A, func(A) B) []B
**/
var Map func(interface{}, func(interface{}) interface{}) []interface{}
var MapString func([]string, func(string) string) []string
var MapInt func([]int, func(int) int) []int
var MapStringToBool func([]string, func(string) bool) []bool
func MakeMap(fn interface{}) {
Maker(fn, _map)
}
func _map(values []reflect.Value) []reflect.Value {
v := interfaceToValue(values[0])
fn := values[1]
var ret reflect.Value
outT := reflect.SliceOf(fn.Type().Out(0))
ret = reflect.MakeSlice(outT, v.Len(), v.Len())
for i := 0; i < v.Len(); i++ {
e := v.Index(i)
r := fn.Call([]reflect.Value{e})
ret.Index(i).Set(r[0])
}
return []reflect.Value{ret}
}
/**
Reference Map impementations
**/
func RefSliceMap(slice []string, fn func(string) string) []string {
ret := make([]string, len(slice), len(slice))
for i := 0; i < len(slice); i++ {
ret[i] = fn(slice[i])
}
return ret
}
func RefMapMap(m map[string]int, fn func(string, int) string) []string {
ret := make([]string, 0, len(m))
for k, v := range m {
ret = append(ret, fn(k, v))
}
return ret
}