package channel func FlatSlice[T any](source <-chan []T) <-chan T { out := make(chan T, cap(source)) go func() { defer close(out) for slice := range source { for _, v := range slice { out <- v } } }() return out } func FlatMap[K comparable, V, T any](source <-chan map[K]V, unmapper func(key K, value V) T) <-chan T { out := make(chan T, cap(source)) go func() { defer close(out) for slice := range source { for k, v := range slice { out <- unmapper(k, v) } } }() return out } func FlatChan[T any](source <-chan <-chan T) <-chan T { out := make(chan T, cap(source)) go func() { defer close(out) for ch := range source { for v := range ch { out <- v } } }() return out }