func dirMapper(key interface{}, value interface{}) map[interface{}]interface{} {
	ret := make(map[interface{}]interface{})

	files, ok := value.([]interface{})
	if !ok {
		return ret
	}

	runFileChan := make(chan map[interface{}]interface{}, 100)
	go func() {
		defer close(runFileChan)

		var wg sync.WaitGroup
		job := core.NewJob(lineMapper, wordReducer)

		for _, v := range files {
			filename := strings.TrimSpace(v.(string))

			wg.Add(1)
			go func(myfile string) {
				defer wg.Done()

				runFileChan <- job.Run(file.ReadLines(myfile))
			}(filename)
		}
		wg.Wait()
	}()

	return core.Reduce(core.Aggregate(runFileChan), wordReducer)
}
func main() {
	runtime.GOMAXPROCS(runtime.NumCPU())
	rand.Seed(int64(time.Second))

	ret := make(map[string]int)
	worker := core.NewWorker(MyProcesser, MyErrorHandler, 10, 10)
	out_chan, _ := worker.Run(file.ReadLines("wordcount.go"))
	for mapResult := range out_chan {
		m, ok := mapResult.(map[string]int)
		if !ok {
			continue
		}

		for k, v := range m {
			_, ok := ret[k]
			if ok {
				ret[k] += v
			} else {
				ret[k] = v
			}
		}
	}

	for k, v := range ret {
		println(fmt.Sprintf("%v          %v", k, v))
	}

}