func (r *Runner) RunSigs(sigs ...os.Signal) <-chan os.Signal {
	sig := make(chan os.Signal, 1)
	signal.Notify(sig, sigs...)
	return sig
}
RunSigs is a convenience method to work with OS signals.
Unlike the other `Run*` functions, the channel returned
is not closed, but reads the received signal.
package runner
import (
	"context"
	"os"
	"os/signal"
	"sync"
)
func New(ctx context.Context) Runner {
	return Runner{Ctx: ctx}
}
type Runner struct {
	Ctx context.Context
	wg  sync.WaitGroup
}
func (r *Runner) Run(f func()) <-chan struct{} {
	done := make(chan struct{})
	r.wg.Add(1)
	go func() {
		defer func() {
			r.wg.Done()
			close(done)
		}()
		f()
	}()
	return done
}
func (r *Runner) RunContext(f func(context.Context)) <-chan struct{} {
	return r.RunOtherContext(r.Ctx, f)
}
func (r *Runner) RunOtherContext(ctx context.Context, f func(context.Context)) <-chan struct{} {
	return r.Run(func() { f(ctx) })
}