package main

import (
	"fmt"
	"sync"
)

func mapLimit(input []int, limit int, transform func(int) int) []int {
	if limit < 1 {
		limit = 1
	}

	output := make([]int, len(input))
	slots := make(chan struct{}, limit)
	var wg sync.WaitGroup

	for index, value := range input {
		index, value := index, value
		wg.Go(func() {
			slots <- struct{}{}
			defer func() { <-slots }()

			output[index] = transform(value)
		})
	}

	wg.Wait()
	return output
}

func main() {
	doubled := mapLimit([]int{1, 2, 3, 4, 5}, 2, func(n int) int {
		return n * 2
	})
	fmt.Println(doubled)
}
