lens @ master

 1package coroutine
 2
 3import (
 4	"context"
 5)
 6
 7// WrapProcess wraps process into a go routine and make it cancelable through context
 8func WrapProcess[V any](ctx context.Context, fun func() (V, error)) (V, error) {
 9	c := make(chan V)
10	e := make(chan error)
11	go func() {
12		defer close(c)
13		defer close(e)
14
15		v, err := fun()
16		if err != nil {
17			e <- err
18		} else {
19			c <- v
20		}
21	}()
22
23	select {
24	case <-ctx.Done():
25		var zero V
26		return zero, ctx.Err()
27	case m := <-c:
28		return m, nil
29	case err := <-e:
30		var zero V
31		return zero, err
32	}
33}