package main import ( "fmt" "os" "os/signal" "syscall" ) func main() { config, err := NewConfig() if err != nil { panic(err) } k, err := NewKeyboard() if err != nil { panic(err) } go k.Listen() defer k.Close() tp := NewTickPrinter(config.Interval) go tp.Start() defer tp.Stop() timer, err := NewTimer(config) if err != nil { panic(err) } tp.Message <- timer.String sigc := make(chan os.Signal) signal.Notify(sigc, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM) go listen(k, tp, timer, func() { close(sigc) }) select { case <-sigc: } } func listen(k *Keyboard, tp *TickPrinter, timer *Timer, stop func()) { for { key := <-k.Events switch key { case 'p': timer.TogglePause() case 'z': fmt.Printf("\n") tp.Flush() case 'r': timer.Reset() case 'q': stop() return } } }