-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathfunctional.go
44 lines (37 loc) · 1.17 KB
/
functional.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
package functional
import "reflect"
// Definition of Map function
type mapFunc func(interface{}) interface{}
// Map maps the function onto the array
func Map(fn mapFunc, array interface{}) []interface{} {
val := reflect.ValueOf(array)
outputArray := make([]interface{}, val.Len())
for i := 0; i < val.Len(); i++ {
outputArray[i] = fn(val.Index(i).Interface())
}
return outputArray
}
// Definition of Filter function
type filterFunc func(interface{}) bool
// Filter filters the array based on the predicate
func Filter(fn filterFunc, array interface{}) []interface{} {
val := reflect.ValueOf(array)
var outputArray []interface{}
for i := 0; i < val.Len(); i++ {
if fn(val.Index(i).Interface()) {
outputArray = append(outputArray, val.Index(i).Interface())
}
}
return outputArray
}
// Definition of Foldl function
type foldlFunc func(interface{}, interface{}) interface{}
// Folds left the array values (reduction) based on the function
func Foldl(fn foldlFunc, array interface{}, accumulator interface{}) interface{} {
val := reflect.ValueOf(array)
var result = accumulator
for i := 0; i < val.Len(); i++ {
result = fn(val.Index(i).Interface(), result)
}
return result
}