package main

import (
	"fmt"
	"sync"
)

func parallelSum(numbers []int, workers int) int {
	if len(numbers) == 0 {
		return 0
	}
	if workers < 1 {
		workers = 1
	}
	if workers > len(numbers) {
		workers = len(numbers)
	}

	partials := make(chan int, workers)
	chunkSize := (len(numbers) + workers - 1) / workers
	var wg sync.WaitGroup

	for start := 0; start < len(numbers); start += chunkSize {
		end := min(start+chunkSize, len(numbers))
		chunk := numbers[start:end]
		wg.Go(func() {
			sum := 0
			for _, number := range chunk {
				sum += number
			}
			partials <- sum
		})
	}

	wg.Wait()
	close(partials)

	total := 0
	for partial := range partials {
		total += partial
	}
	return total
}

func main() {
	fmt.Println(parallelSum([]int{1, 2, 3, 4, 5, 6, 7, 8}, 3))
}
