func RetryUntil()

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
}