    module System.Taffybar.Widget.Generic.ChannelWidget where

    import Control.Concurrent
    import Control.Monad
    import Control.Monad.IO.Class
    import GI.Gtk

    channelWidgetNew :: (MonadIO m, IsWidget w) => w -> Chan a -> (a -> IO ()) -> m w
    channelWidgetNew widget channel updateWidget = do
      void $ onWidgetRealize widget $ do
        ourChan <- dupChan channel
        processingThreadId <- forkIO $ forever $
          readChan ourChan >>= updateWidget
        void $ onWidgetUnrealize widget $ killThread processingThreadId
      widgetShowAll widget
      return widget