exec.go 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package signal
  2. import (
  3. "context"
  4. )
  5. func executeAndFulfill(f func() error, done chan<- error) {
  6. err := f()
  7. if err != nil {
  8. done <- err
  9. }
  10. close(done)
  11. }
  12. // Execute runs a list of tasks sequentially, returns the first error encountered or nil if all tasks pass.
  13. func Execute(tasks ...func() error) error {
  14. for _, task := range tasks {
  15. if err := task(); err != nil {
  16. return err
  17. }
  18. }
  19. return nil
  20. }
  21. // ExecuteAsync executes a function asynchronously and return its result.
  22. func ExecuteAsync(f func() error) <-chan error {
  23. done := make(chan error, 1)
  24. go executeAndFulfill(f, done)
  25. return done
  26. }
  27. func ErrorOrFinish1(ctx context.Context, c <-chan error) error {
  28. select {
  29. case <-ctx.Done():
  30. return ctx.Err()
  31. case err := <-c:
  32. return err
  33. }
  34. }
  35. func ErrorOrFinish2(ctx context.Context, c1, c2 <-chan error) error {
  36. select {
  37. case <-ctx.Done():
  38. return ctx.Err()
  39. case err := <-c1:
  40. if err != nil {
  41. return err
  42. }
  43. return ErrorOrFinish1(ctx, c2)
  44. case err := <-c2:
  45. if err != nil {
  46. return err
  47. }
  48. return ErrorOrFinish1(ctx, c1)
  49. }
  50. }