module System.Taffybar.Widget.Generic.ChannelGraph where import Control.Concurrent import Control.Monad import Control.Monad.IO.Class import GI.Gtk import System.Taffybar.Widget.Generic.Graph channelGraphNew :: MonadIO m => GraphConfig -> Chan a -> (a -> IO [Double]) -> m GI.Gtk.Widget channelGraphNew config chan sampleBuilder = do (graphWidget, graphHandle) <- graphNew config _ <- onWidgetRealize graphWidget $ do ourChan <- dupChan chan sampleThread <- forkIO $ forever $ do value <- readChan ourChan sampleBuilder value >>= graphAddSample graphHandle void $ onWidgetUnrealize graphWidget $ killThread sampleThread return graphWidget