package wrap import ( "context" "log" "mayhem-party/src/device/input/button" "os" "os/signal" ) type Refresh struct { can context.CancelFunc input Wrap } func NewRefreshCh(sig os.Signal) <-chan os.Signal { c := make(chan os.Signal, 1) signal.Notify(c, sig) return c } func NewRefresh(newWrap func() Wrap, ch <-chan os.Signal) *Refresh { ctx, can := context.WithCancel(context.Background()) result := &Refresh{ can: can, input: newWrap(), } go func() { defer log.Println("refreshing done") for { select { case <-ctx.Done(): return case sig := <-ch: log.Println("refreshing for", sig) result.input = newWrap() } } }() return result } func (r *Refresh) Read() []button.Button { return r.input.Read() } func (r *Refresh) Close() { r.can() r.input.Close() }