Skip to content

Instantly share code, notes, and snippets.

@bouk
Forked from rafkhan/hi_reddit.go
Last active May 6, 2018 13:09
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save bouk/fbf273835d996c9f072e to your computer and use it in GitHub Desktop.
Save bouk/fbf273835d996c9f072e to your computer and use it in GitHub Desktop.
package main
import (
"fmt"
"reflect"
)
func main() {
a := []int{1, 2, 3, 4}
b := Map(a, func(val interface{}) interface{} {
return val.(int) * 2
})
fmt.Println("Map:", a, b)
c := Reduce(b, 0, func(val interface{}, memo interface{}) interface{} {
return memo.(int) + val.(int)
})
fmt.Println("Reduce:", b, c)
d := Filter(b, func(val interface{}) bool {
return val.(int)%4 == 0
})
fmt.Println("Filter:", b, d)
}
func Map(in interface{}, fn func(interface{}) interface{}) 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
}
func Reduce(in interface{}, memo interface{}, fn func(interface{}, interface{}) interface{}) interface{} {
val := reflect.ValueOf(in)
for i := 0; i < val.Len(); i++ {
memo = fn(val.Index(i).Interface(), memo)
}
return memo
}
func Filter(in interface{}, fn func(interface{}) bool) 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
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment