| // Copyright 2009 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 time | 
 |  | 
 | import "errors" | 
 |  | 
 | // A Ticker holds a channel that delivers ``ticks'' of a clock | 
 | // at intervals. | 
 | type Ticker struct { | 
 | 	C <-chan Time // The channel on which the ticks are delivered. | 
 | 	r runtimeTimer | 
 | } | 
 |  | 
 | // NewTicker returns a new Ticker containing a channel that will send | 
 | // the time on the channel after each tick. The period of the ticks is | 
 | // specified by the duration argument. The ticker will adjust the time | 
 | // interval or drop ticks to make up for slow receivers. | 
 | // The duration d must be greater than zero; if not, NewTicker will | 
 | // panic. Stop the ticker to release associated resources. | 
 | func NewTicker(d Duration) *Ticker { | 
 | 	if d <= 0 { | 
 | 		panic(errors.New("non-positive interval for NewTicker")) | 
 | 	} | 
 | 	// Give the channel a 1-element time buffer. | 
 | 	// If the client falls behind while reading, we drop ticks | 
 | 	// on the floor until the client catches up. | 
 | 	c := make(chan Time, 1) | 
 | 	t := &Ticker{ | 
 | 		C: c, | 
 | 		r: runtimeTimer{ | 
 | 			when:   when(d), | 
 | 			period: int64(d), | 
 | 			f:      sendTime, | 
 | 			arg:    c, | 
 | 		}, | 
 | 	} | 
 | 	startTimer(&t.r) | 
 | 	return t | 
 | } | 
 |  | 
 | // Stop turns off a ticker. After Stop, no more ticks will be sent. | 
 | // Stop does not close the channel, to prevent a concurrent goroutine | 
 | // reading from the channel from seeing an erroneous "tick". | 
 | func (t *Ticker) Stop() { | 
 | 	stopTimer(&t.r) | 
 | } | 
 |  | 
 | // Reset stops a ticker and resets its period to the specified duration. | 
 | // The next tick will arrive after the new period elapses. | 
 | func (t *Ticker) Reset(d Duration) { | 
 | 	if t.r.f == nil { | 
 | 		panic("time: Reset called on uninitialized Ticker") | 
 | 	} | 
 | 	modTimer(&t.r, when(d), int64(d), t.r.f, t.r.arg, t.r.seq) | 
 | } | 
 |  | 
 | // Tick is a convenience wrapper for NewTicker providing access to the ticking | 
 | // channel only. While Tick is useful for clients that have no need to shut down | 
 | // the Ticker, be aware that without a way to shut it down the underlying | 
 | // Ticker cannot be recovered by the garbage collector; it "leaks". | 
 | // Unlike NewTicker, Tick will return nil if d <= 0. | 
 | func Tick(d Duration) <-chan Time { | 
 | 	if d <= 0 { | 
 | 		return nil | 
 | 	} | 
 | 	return NewTicker(d).C | 
 | } |