    module System.Taffybar.Widget.Text.MemoryMonitor (textMemoryMonitorNew) where

    import qualified Text.StringTemplate as ST
    import System.Taffybar.Information.Memory
    import System.Taffybar.Widget.Generic.PollingLabel ( pollingLabelNew )
    import qualified GI.Gtk
    import qualified Data.Text as T

    -- | Creates a simple textual memory monitor. It updates once every polling
    -- period (in seconds).
    textMemoryMonitorNew :: String -- ^ Format. You can use variables: "used", "total", "free", "buffer", "cache", "rest", "used".
                         -> Double -- ^ Polling period in seconds.
                         -> IO GI.Gtk.Widget
    textMemoryMonitorNew fmt period = do
        label <- pollingLabelNew (T.pack fmt) period callback
        GI.Gtk.widgetShowAll label
        return label
        where
          callback = do
            info <- parseMeminfo
            let template = ST.newSTMP fmt
            let labels = ["used", "total", "free", "buffer", "cache", "rest", "used"]
            let actions = [memoryUsed, memoryTotal, memoryFree, memoryBuffer, memoryCache, memoryRest]
                actions' = map ((show . intRound).) actions
            let stats = [f info | f <- actions']
            let template' = ST.setManyAttrib (zip labels stats) template
            return $ ST.render template'

    intRound :: Double -> Int
    intRound = round