Lychee Avatar

Tiny Go utility

Download

A quick go snippet I reach for often.

pipe.go go

Fan-in channel combiner — closes out when every input closes.

package pipe

import "sync"

func FanIn[T any](inputs ...<-chan T) <-chan T {
	out := make(chan T)
	var wg sync.WaitGroup
	wg.Add(len(inputs))
	for _, in := range inputs {
		go func(c <-chan T) {
			defer wg.Done()
			for v := range c {
				out <- v
			}
		}(in)
	}
	go func() {
		wg.Wait()
		close(out)
	}()
	return out
}
pipe.go go

Fan-in channel combiner — closes out when every input closes.

package pipe

import "sync"

func FanIn[T any](inputs ...<-chan T) <-chan T {
	out := make(chan T)
	var wg sync.WaitGroup
	wg.Add(len(inputs))
	for _, in := range inputs {
		go func(c <-chan T) {
			defer wg.Done()
			for v := range c {
				out <- v
			}
		}(in)
	}
	go func() {
		wg.Wait()
		close(out)
	}()
	return out
}

Open to suggestions — fork it if you can do better.

Developer Discussions