package backoff

import (
	
)

var since = time.Since

const defaultDelay = 100 * time.Millisecond
const defaultMaxDelay = 1 * time.Minute

type ExpBackoff struct {
	Delay    time.Duration
	MaxDelay time.Duration

	failures int
	lastRun  time.Time
}

func ( *ExpBackoff) () {
	if .Delay == 0 {
		.Delay = defaultDelay
	}
	if .MaxDelay == 0 {
		.MaxDelay = defaultMaxDelay
	}
}

func ( *ExpBackoff) () time.Duration {
	 := .Delay * time.Duration(1<<(.failures-1))
	 = min(, .MaxDelay)
	return 
}

func ( *ExpBackoff) ( func() error) ( error,  bool) {
	.init()

	if .failures != 0 {
		if since(.lastRun) < .calcDelay() {
			return nil, false
		}
	}

	.lastRun = time.Now()
	 = ()
	if  == nil {
		.failures = 0
	} else {
		.failures++
	}
	return , true
}