-
Notifications
You must be signed in to change notification settings - Fork 0
/
map.go
48 lines (35 loc) · 964 Bytes
/
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
package utils
import "reflect"
type mapf func(interface{}) interface{}
// func(value, memo) interface
type reducef func(interface{}, interface{}) interface{}
type filterf func(interface{}) bool
//Map(slice, func)
func Map(in interface{}, fn mapf) interface{} {
val := reflect.ValueOf(in)
out := make([]interface{}, val.Len())
for i := 0; i < val.Len(); i++ {
out[i] = fn(val.Index(i).Interface())
}
return out
}
//Reduce(slice, starting value, func)
func Reduce(in interface{}, memo interface{}, fn reducef) interface{} {
val := reflect.ValueOf(in)
for i := 0; i < val.Len(); i++ {
memo = fn(val.Index(i).Interface(), memo)
}
return memo
}
//Filter(slice, predicate func)
func Filter(in interface{}, fn filterf) interface{} {
val := reflect.ValueOf(in)
out := make([]interface{}, 0, val.Len())
for i := 0; i < val.Len(); i++ {
current := val.Index(i).Interface()
if fn(current) {
out = append(out, current)
}
}
return out
}