package main import ( "os" "os/signal" "syscall" "time" ) 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 'a': timer.Add(time.Second) case 'A': timer.Add(time.Minute) case 's': timer.Sub(time.Second) case 'S': timer.Sub(time.Minute) case 'p': tp.Flush() timer.TogglePause() case 'z': tp.Flush() case 'r': tp.Flush() timer.Reset() case 'q': stop() return } } }