// Copyright 2020 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Package poller supports periodic polling to load a value.
package poller

import (
	"context"
	"sync"
	"time"
)

// A Getter returns a value.
type Getter func(context.Context) (interface{}, error)

// A Poller maintains a current value, and refreshes it by periodically
// polling for a new value.
type Poller struct {
	getter  Getter
	onError func(error)
	mu      sync.Mutex
	current interface{}
}

// New creates a new poller with an initial value. The getter is invoked
// to obtain updated values. Errors returned from the getter are passed
// to onError.
func New(initial interface{}, getter Getter, onError func(error)) *Poller {
	return &Poller{
		getter:  getter,
		onError: onError,
		current: initial,
	}
}

// Start begins polling in a separate goroutine, at the given period. To stop
// the goroutine, cancel the context passed to Start.
func (p *Poller) Start(ctx context.Context, period time.Duration) {
	ticker := time.NewTicker(period)

	go func() {
		for {
			select {
			case <-ctx.Done():
				ticker.Stop()
				return
			case <-ticker.C:
				ctx2, cancel := context.WithTimeout(ctx, period)
				p.Poll(ctx2)
				cancel()
			}
		}
	}()
}

// Poll calls p's getter immediately and synchronously.
func (p *Poller) Poll(ctx context.Context) {
	next, err := p.getter(ctx)
	if err != nil {
		p.onError(err)
	} else {
		p.mu.Lock()
		p.current = next
		p.mu.Unlock()
	}
}

// Current returns the current value. Initially, this is the value passed to New.
// After each successful poll, the value is updated.
// If a poll fails, the value remains unchanged.
func (p *Poller) Current() interface{} {
	p.mu.Lock()
	defer p.mu.Unlock()
	return p.current
}
