package main

type Task struct {
	ID      string
	Payload interface{}
}

type TaskCallback func(Task) error

type JobPool struct {
	// pools 线程池大小
	pools int
	// tasks 任务列表
	tasks chan Task
	// callback 执行任务的具体函数
	callback TaskCallback
	// result 执行结果标志位
	result chan int
}

// NewJobPool 生成默认的 Job 池
func NewJobPool() *JobPool {
	return &JobPool{
		pools:  10,
		tasks:  make(chan Task, 100),
		result: make(chan int),
	}
}

// Push 添加任务
func (t *JobPool) Push(task Task) {
	t.tasks <- task
}

// Callback 设置 Callback
func (t *JobPool) Callback(f TaskCallback) {
	t.callback = f
}

// Start 启动 Job 服务
func (t *JobPool) Start() {
	for i := 0; i < t.pools; i += 1 {
		go func() {
			for {
				task := <-t.tasks
				t.callback(task)

				t.result <- 1
			}
		}()
	}
}

func (t *JobPool) Done(total int) {
	cursor := 0
	if total < 1 {
		return
	}

	for {
		<-t.result
		cursor += 1

		if cursor >= total {
			break
		}
	}
}