package main
 
import (
	"fmt"
	"time"
	"os"
	"os/signal"
)
 
type Timer struct {
	Queue chan *TimeCall
}
 
func NewTimer(l int) *Timer {
	timer := new(Timer)
	timer.Queue = make(chan *TimeCall,l)
	return timer
}
 
type TimeCall struct {
	callback func()
}
 
func (this *TimeCall) CallBack() {
	defer func() { recover() }()
	if this.callback != nil {
		this.callback()
	}
}
 
func 
(this 
*Timer
) AfterFunc
(d 
time.
Duration, callback func
()) *TimeCall 
{	call := new(TimeCall)
	call.callback = callback
	call.
timer = time.
AfterFunc(d
, func
() {		this.Queue <- call
	})
	return call
}
 
 
 
type PipeService struct {
	TimeCall *Timer
}
 
func 
(this 
*PipeService
) AfterFunc
(delay 
time.
Duration, callback func
()) *TimeCall 
{	return this.TimeCall.AfterFunc(delay, callback)
}
 
func 
(this 
*PipeService
) IntervalCall
(interval 
time.
Duration, callback func
()) {	this.TimeCall.AfterFunc(interval,func(){
		if callback != nil {
			callback()
		}
		this.AfterFunc(interval,callback)
	})
}
 
func (this *PipeService) Run(closeSig chan bool) {
	for {
		select {
		case <-closeSig:
			return
		case call := <-this.TimeCall.Queue:
			call.CallBack()
		}
	}
}
 
func main() {
	var closeChan chan bool
 	InsPipeService := &PipeService{TimeCall: NewTimer(10)}
	InsPipeService.
IntervalCall(2*time.
Second,func
(){		fmt.Println("interval call")
	})
 
	c := make(chan os.Signal, 1)
	signal.Notify(c, os.Interrupt, os.Kill)
 
	go func(){
		InsPipeService.Run(closeChan)
	}()
 
}
 
				cGFja2FnZSBtYWluCgppbXBvcnQgKAoJImZtdCIKCSJ0aW1lIgoJIm9zIgoJIm9zL3NpZ25hbCIKKQoKdHlwZSBUaW1lciBzdHJ1Y3QgewoJUXVldWUgY2hhbiAqVGltZUNhbGwKfQoKZnVuYyBOZXdUaW1lcihsIGludCkgKlRpbWVyIHsKCXRpbWVyIDo9IG5ldyhUaW1lcikKCXRpbWVyLlF1ZXVlID0gbWFrZShjaGFuICpUaW1lQ2FsbCxsKQoJcmV0dXJuIHRpbWVyCn0KCnR5cGUgVGltZUNhbGwgc3RydWN0IHsKCXRpbWVyICAgICp0aW1lLlRpbWVyCgljYWxsYmFjayBmdW5jKCkKfQoKZnVuYyAodGhpcyAqVGltZUNhbGwpIENhbGxCYWNrKCkgewoJZGVmZXIgZnVuYygpIHsgcmVjb3ZlcigpIH0oKQoJaWYgdGhpcy5jYWxsYmFjayAhPSBuaWwgewoJCXRoaXMuY2FsbGJhY2soKQoJfQp9CgpmdW5jICh0aGlzICpUaW1lcikgQWZ0ZXJGdW5jKGQgdGltZS5EdXJhdGlvbiwgY2FsbGJhY2sgZnVuYygpKSAqVGltZUNhbGwgewoJY2FsbCA6PSBuZXcoVGltZUNhbGwpCgljYWxsLmNhbGxiYWNrID0gY2FsbGJhY2sKCWNhbGwudGltZXIgPSB0aW1lLkFmdGVyRnVuYyhkLCBmdW5jKCkgewoJCXRoaXMuUXVldWUgPC0gY2FsbAoJfSkKCXJldHVybiBjYWxsCn0KCgoKdHlwZSBQaXBlU2VydmljZSBzdHJ1Y3QgewoJVGltZUNhbGwgKlRpbWVyCn0KCmZ1bmMgKHRoaXMgKlBpcGVTZXJ2aWNlKSBBZnRlckZ1bmMoZGVsYXkgdGltZS5EdXJhdGlvbiwgY2FsbGJhY2sgZnVuYygpKSAqVGltZUNhbGwgewoJcmV0dXJuIHRoaXMuVGltZUNhbGwuQWZ0ZXJGdW5jKGRlbGF5LCBjYWxsYmFjaykKfQoKZnVuYyAodGhpcyAqUGlwZVNlcnZpY2UpIEludGVydmFsQ2FsbChpbnRlcnZhbCB0aW1lLkR1cmF0aW9uLCBjYWxsYmFjayBmdW5jKCkpIHsKCXRoaXMuVGltZUNhbGwuQWZ0ZXJGdW5jKGludGVydmFsLGZ1bmMoKXsKCQlpZiBjYWxsYmFjayAhPSBuaWwgewoJCQljYWxsYmFjaygpCgkJfQoJCXRoaXMuQWZ0ZXJGdW5jKGludGVydmFsLGNhbGxiYWNrKQoJfSkKfQoKZnVuYyAodGhpcyAqUGlwZVNlcnZpY2UpIFJ1bihjbG9zZVNpZyBjaGFuIGJvb2wpIHsKCWZvciB7CgkJc2VsZWN0IHsKCQljYXNlIDwtY2xvc2VTaWc6CgkJCXJldHVybgoJCWNhc2UgY2FsbCA6PSA8LXRoaXMuVGltZUNhbGwuUXVldWU6CgkJCWNhbGwuQ2FsbEJhY2soKQoJCX0KCX0KfQoKZnVuYyBtYWluKCkgewoJdmFyIGNsb3NlQ2hhbiBjaGFuIGJvb2wKIAlJbnNQaXBlU2VydmljZSA6PSAmUGlwZVNlcnZpY2V7VGltZUNhbGw6IE5ld1RpbWVyKDEwKX0KCUluc1BpcGVTZXJ2aWNlLkludGVydmFsQ2FsbCgyKnRpbWUuU2Vjb25kLGZ1bmMoKXsKCQlmbXQuUHJpbnRsbigiaW50ZXJ2YWwgY2FsbCIpCgl9KQoKCWMgOj0gbWFrZShjaGFuIG9zLlNpZ25hbCwgMSkKCXNpZ25hbC5Ob3RpZnkoYywgb3MuSW50ZXJydXB0LCBvcy5LaWxsKQoKCWdvIGZ1bmMoKXsKCQlJbnNQaXBlU2VydmljZS5SdW4oY2xvc2VDaGFuKQoJfSgpCgoJdGltZS5TbGVlcCgxMCp0aW1lLlNlY29uZCkKfQo=