package run_test import ( "context" "errors" "fmt" "net" "net/http" "time" "github.com/oklog/run" ) func ExampleGroup_Add_basic() { var g run.Group { cancel := make(chan struct{}) g.Add(func() error { select { case <-time.After(time.Second): fmt.Printf("The first actor had its time elapsed\n") return nil case <-cancel: fmt.Printf("The first actor was canceled\n") return nil } }, func(err error) { fmt.Printf("The first actor was interrupted with: %v\n", err) close(cancel) }) } { g.Add(func() error { fmt.Printf("The second actor is returning immediately\n") return errors.New("immediate teardown") }, func(err error) { // Note that this interrupt function is called, even though the // corresponding execute function has already returned. fmt.Printf("The second actor was interrupted with: %v\n", err) }) } fmt.Printf("The group was terminated with: %v\n", g.Run()) // Output: // The second actor is returning immediately // The first actor was interrupted with: immediate teardown // The second actor was interrupted with: immediate teardown // The first actor was canceled // The group was terminated with: immediate teardown } func ExampleGroup_Add_context() { ctx, cancel := context.WithCancel(context.Background()) var g run.Group { ctx, cancel := context.WithCancel(ctx) // note: shadowed g.Add(func() error { return runUntilCanceled(ctx) }, func(error) { cancel() }) } go cancel() fmt.Printf("The group was terminated with: %v\n", g.Run()) // Output: // The group was terminated with: context canceled } func ExampleGroup_Add_listener() { var g run.Group { ln, _ := net.Listen("tcp", ":0") g.Add(func() error { defer fmt.Printf("http.Serve returned\n") return http.Serve(ln, http.NewServeMux()) }, func(error) { ln.Close() }) } { g.Add(func() error { return errors.New("immediate teardown") }, func(error) { // }) } fmt.Printf("The group was terminated with: %v\n", g.Run()) // Output: // http.Serve returned // The group was terminated with: immediate teardown } func runUntilCanceled(ctx context.Context) error { <-ctx.Done() return ctx.Err() }