package tool

import (
	"sync"
)

// GoFunc 对一个map进行指定携程数进行处理数据
// wgs  协程数
// do调用的方法
// data 源数据
func GoFunc[k comparable, v comparable](wgs int, do func(...interface{}), data map[k]v) {
	ch := make(chan []interface{}, len(data))
	wg := sync.WaitGroup{}
	wg.Add(wgs)
	go func() {
		defer wg.Done()
		defer close(ch)
		for k, v := range data {
			ch <- []interface{}{k, v}
		}
	}()
	for i := 0; i < wgs-1; i++ {
		go func() {
			defer wg.Done()
			for {
				val, ok := <-ch
				if !ok {
					return
				}
				do(val[0], val[1])

			}
		}()
	}
	wg.Wait()
}

// GoFuncArr 对一个arr进行指定携程数进行处理数据
// wgs  协程数
// do调用的方法
// data 源数据
func GoFuncArr(wgs int, do func(i int64), data []int64) {
	ch := make(chan int64, len(data))
	wg := sync.WaitGroup{}
	wg.Add(wgs)
	go func() {
		defer wg.Done()
		defer close(ch)
		for _, v := range data {
			ch <- v
		}
	}()
	for i := 0; i < wgs-1; i++ {
		go func() {
			defer wg.Done()
			for {
				val, ok := <-ch
				if !ok {
					return
				}
				do(val)

			}
		}()
	}
	wg.Wait()
}
