| package slowmessage |
| |
| import ( |
| "time" |
| ) |
| |
| // SlowFunc is the function that could be slow. Usually, you'll have to |
| // wrap an existing function in a lambda to make it match this type signature. |
| type SlowFunc func() error |
| |
| // CallbackFunc is the function that is triggered when the threshold is reached. |
| type CallbackFunc func() |
| |
| // Do calls sf. If threshold time has passed, cb is called. Note that this |
| // call will be made concurrently to sf still running. |
| func Do(threshold time.Duration, sf SlowFunc, cb CallbackFunc) error { |
| // Call the slow function |
| errCh := make(chan error, 1) |
| go func() { |
| errCh <- sf() |
| }() |
| |
| // Wait for it to complete or the threshold to pass |
| select { |
| case err := <-errCh: |
| return err |
| case <-time.After(threshold): |
| // Threshold reached, call the callback |
| cb() |
| } |
| |
| // Wait an indefinite amount of time for it to finally complete |
| return <-errCh |
| } |