Generics allowed me to design a different API from other libraries. Instead of submitting a function for each task (as other libraries do), you submit values. This enabled me to make the pools connectable into pipelines, which can be useful if you want to separate IO-intensive from CPU-intensive tasks, or tasks of different parallelizability.
It also supports auto-scaling (resizable number of workers), which currently works well for my needs, but has a lot of room for improvement, especially in the case of pipelines with bottleneck.
Type Pool[I, O, C any] has three type parameters, but if you don't need all of them, I offer constructors that hide some of those types (by assigning them to empty struct).
I would appreciate your feedback.