Puppollo
3/25/2015 - 9:07 AM

filtering

filtering

package main

import (
	"fmt"
	"sync"
)

type FilterFunc func(int) bool

func notTwo(value int) bool {
	return value == 2
}

func notFive(value int) bool {
	return value == 5
}

func main() {

	a := []int{1, 2, 3, 4, 5, 6, 7, 8}
	b := filter(a, notTwo, notFive)
	fmt.Println(a)
	fmt.Println(b)
}

//=======================================================================
/**
filter function
 */
func filter(a []int, filters ...FilterFunc) []int {
	var wg sync.WaitGroup
	resChan := make(chan int, len(a))
	for _, value := range a {
		wg.Add(1)
		go filtering(value, &wg, resChan, filters...)
	}
	wg.Wait()
	close(resChan)

	res := make([]int, 0)
	for val := range resChan {
		res = append(res, val)
	}
	return res
}

/**
do filtering for value
 */
func filtering(value int, wg *sync.WaitGroup, resChan chan int, filters... FilterFunc) {
	defer wg.Done()
	println("value: ", value)
	for _, filter := range filters {
		if filter(value) {
			return
		}
	}
	resChan<-value
}