package notifications type ChannelSplitter[TNotification any] struct { ch chan TNotification Listeners map[string]chan TNotification } func (s *ChannelSplitter[TNotification]) Listen() { go func() { for { select { case msg := <-s.ch: for _, v := range s.Listeners { v <- msg } } } }() } func (s *ChannelSplitter[TNotification]) Add(id string) chan TNotification { ch := make(chan TNotification) s.Listeners[id] = ch return ch } func (s *ChannelSplitter[TNotification]) Remove(id string) { delete(s.Listeners, id) } func NewChannelSplitter[TNotification any](ch chan TNotification) ChannelSplitter[TNotification] { return ChannelSplitter[TNotification]{ ch: ch, Listeners: make(map[string]chan TNotification), } }