/* ticker.go: after version 1, we don't need this atm, but we keep it. */ package utils import ( "time" ) // Ticker is the timer which is used in cache type Ticker struct { ticker *time.Ticker started bool tickHandlers []func() } // NewTicker returns a new Ticker func NewTicker() *Ticker { return &Ticker{tickHandlers: make([]func(), 0), started: false} } // OnTick add event handlers/ callbacks which are called on each timer's tick func (c *Ticker) OnTick(h func()) { c.tickHandlers = append(c.tickHandlers, h) } // Start starts the timer and execute all listener's when tick func (c *Ticker) Start(duration time.Duration) { if c.started { return } if c.ticker != nil { panic("Iris Ticker: Cannot re-start a cache timer, if you stop it, it is not recommented to resume it,\n Just create a new CacheTimer.") } c.ticker = time.NewTicker(duration) go func() { for t := range c.ticker.C { _ = t // c.mu.Lock() // c.mu.Unlock() //I can make it a clojure to handle only handlers that are registed before .start() but we are ok with this, it is not map no need to Lock, for now. for i := range c.tickHandlers { c.tickHandlers[i]() } } }() c.started = true } // Stop stops the ticker func (c *Ticker) Stop() { if c.started { c.ticker.Stop() c.started = false } } // ITick is the interface which all ticker's listeners must implement type ITick interface { OnTick() }