in timed/timed.go [110:125]
func RetryUntil(ctx canceler, timeout, period time.Duration, fn func(canceler) error) error {
ctx, cancel := context.WithTimeout(ctxtool.FromCanceller(ctx), timeout)
defer cancel()
for ctx.Err() == nil {
checkErr := fn(ctx)
if checkErr == nil {
break
}
if err := Wait(ctx, period); err != nil {
return fmt.Errorf("the function has exceeded the deadline: %w", checkErr)
}
}
return nil
}