package backoff import ( "context" "time" ) type ConstantInterval struct { interval time.Duration jitter jitter } func NewConstantInterval(options ...ConstantOption) *ConstantInterval { jitterFactor := 0.0 interval := time.Minute var rng Random for _, option := range options { switch option.Ident() { case identInterval{}: interval = option.Value().(time.Duration) case identJitterFactor{}: jitterFactor = option.Value().(float64) case identRNG{}: rng = option.Value().(Random) } } return &ConstantInterval{ interval: interval, jitter: newJitter(jitterFactor, rng), } } func (g *ConstantInterval) Next() time.Duration { return time.Duration(g.jitter.apply(float64(g.interval))) } type ConstantPolicy struct { cOptions []ControllerOption igOptions []ConstantOption } func NewConstantPolicy(options ...Option) *ConstantPolicy { var cOptions []ControllerOption var igOptions []ConstantOption for _, option := range options { switch opt := option.(type) { case ControllerOption: cOptions = append(cOptions, opt) default: igOptions = append(igOptions, opt.(ConstantOption)) } } return &ConstantPolicy{ cOptions: cOptions, igOptions: igOptions, } } func (p *ConstantPolicy) Start(ctx context.Context) Controller { ig := NewConstantInterval(p.igOptions...) return newController(ctx, ig, p.cOptions...) }