60 lines
		
	
	
		
			817 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			817 B
		
	
	
	
		
			Go
		
	
	
	
	
	
package main
 | 
						|
 | 
						|
import (
 | 
						|
	"time"
 | 
						|
)
 | 
						|
 | 
						|
type Timer struct {
 | 
						|
	pending AtomicBool
 | 
						|
	timer   *time.Timer
 | 
						|
}
 | 
						|
 | 
						|
/* Starts the timer if not already pending
 | 
						|
 */
 | 
						|
func (t *Timer) Start(dur time.Duration) bool {
 | 
						|
	set := t.pending.Swap(true)
 | 
						|
	if !set {
 | 
						|
		t.timer.Reset(dur)
 | 
						|
		return true
 | 
						|
	}
 | 
						|
	return false
 | 
						|
}
 | 
						|
 | 
						|
/* Stops the timer
 | 
						|
 */
 | 
						|
func (t *Timer) Stop() {
 | 
						|
	set := t.pending.Swap(true)
 | 
						|
	if set {
 | 
						|
		t.timer.Stop()
 | 
						|
		select {
 | 
						|
		case <-t.timer.C:
 | 
						|
		default:
 | 
						|
		}
 | 
						|
	}
 | 
						|
	t.pending.Set(false)
 | 
						|
}
 | 
						|
 | 
						|
func (t *Timer) Pending() bool {
 | 
						|
	return t.pending.Get()
 | 
						|
}
 | 
						|
 | 
						|
func (t *Timer) Reset(dur time.Duration) {
 | 
						|
	t.pending.Set(false)
 | 
						|
	t.Start(dur)
 | 
						|
}
 | 
						|
 | 
						|
func (t *Timer) Wait() <-chan time.Time {
 | 
						|
	return t.timer.C
 | 
						|
}
 | 
						|
 | 
						|
func NewTimer() (t Timer) {
 | 
						|
	t.pending.Set(false)
 | 
						|
	t.timer = time.NewTimer(0)
 | 
						|
	t.timer.Stop()
 | 
						|
	select {
 | 
						|
	case <-t.timer.C:
 | 
						|
	default:
 | 
						|
	}
 | 
						|
	return
 | 
						|
}
 |