package coroutine import ( "context" ) // WrapProcess wraps process into a go routine and make it cancelable through context func WrapProcess[V any](ctx context.Context, fun func() (V, error)) (V, error) { c := make(chan V) e := make(chan error) go func() { defer close(c) defer close(e) v, err := fun() if err != nil { e <- err } else { c <- v } }() select { case <-ctx.Done(): var zero V return zero, ctx.Err() case m := <-c: return m, nil case err := <-e: var zero V return zero, err } }