hi3status-0.1.0.0: lib-src/Hi3Status/Block.hs
{-|
Module : Hi3Status.Block
License : MIT
Maintainer : Josh Kirklin (jjvk2@cam.ac.uk)
Stability : experimental
Blocks are the main components of a status line. A block is any instance of the
'Block' class.
-}
module Hi3Status.Block (
-- * Class
Block (..),
-- * Monad
BlockM (),
pushBlockDescription,
waitForUpdateSignal,
getUpdater,
-- * Descriptions
BlockDescription (..),
emptyBlockDescription
) where
import Hi3Status.Block.Internal
import Control.Concurrent.Chan
import Control.Concurrent.MVar
-- | Push a new block description to the status line.
pushBlockDescription :: BlockDescription -> BlockM ()
pushBlockDescription bd = BlockM $ \p _ c -> writeChan c . BlockUpdate p $ bd
-- | Wait until an update is required.
waitForUpdateSignal :: BlockM ()
waitForUpdateSignal = BlockM $ \_ u _ -> takeMVar u >> return ()
-- | Return the updater for this block, i.e. a value of the type @IO ()@ that
-- when run will request that the block be updated. This is useful when, for
-- example, we desire to set an update timer internal to the block itself:
--
-- @
-- updateInFiveSeconds :: BlockM ()
-- updateInFiveSeconds = do
-- updater <- getUpdater
-- liftIO $ forkIO $ do
-- threadDelay 5000000
-- updater
-- @
getUpdater :: BlockM (IO ())
getUpdater = BlockM $ \_ u _ -> return $ update u
class Block a where
-- | This function takes in a block, and returns a value of type
-- @BlockM ()@, which is executed in its own thread when the status line
-- begins.
runBlock :: a -> BlockM ()