hi3status-0.1.0.0: lib-src/Hi3Status/Block/Util.hs
{-|
Module : Hi3Status.Block.Util
License : MIT
Maintainer : Josh Kirklin (jjvk2@cam.ac.uk)
Stability : experimental
This module contains a number of common functions that are useful for writing
blocks.
-}
{-# LANGUAGE OverloadedStrings #-}
module Hi3Status.Block.Util (
-- * BlockM
onUpdate,
periodic,
periodic_,
-- * Text formatting
formatText,
maxLengthText
) where
import Hi3Status.Block
import Control.Concurrent
import Control.Monad.IO.Class
import qualified Data.Text as T
-- | Perform a given 'BlockM' when an update is required.
onUpdate :: BlockM () -> BlockM ()
onUpdate blockm = do
waitForUpdateSignal
blockm
onUpdate blockm
-- | Perform a given 'BlockM' every given number of microseconds, or whenever
-- an update is requested.
periodic :: Int -> BlockM () -> BlockM ()
periodic t blockm = do
u <- getUpdater
liftIO $ forkIO $ timer u
go
where
go = do
blockm
waitForUpdateSignal
go
timer u = do
threadDelay t
u
timer u
-- | Perform a given 'BlockM' every given number of microseconds.
periodic_ :: Int -> BlockM () -> BlockM ()
periodic_ t blockm = do
blockm
liftIO $ threadDelay t
periodic_ t blockm
-- | Format a string using the given substitutions and return it as a
-- 'Data.Text.Text'.
--
-- >>> formatText [("status","Ready"),("percentage","85")] "{status}: {percentage}%" = "Ready: 85%"
formatText :: [(String, String)] -> String -> T.Text
formatText subs format = foldl (flip ($)) (T.pack format)
$ map makeFormatter subs
where
makeFormatter (t,s) = T.replace (T.concat ["{",T.pack t,"}"]) (T.pack s)
maxLengthText :: String -> Maybe Int -> String
maxLengthText t ml = case ml of
Nothing -> t
Just n -> (take n t) ++ (if n < length t then "..." else "")