module Graphics.Vty.Widgets.Util
( on
, fgColor
, bgColor
, style
, mergeAttr
, mergeAttrs
, withWidth
, withHeight
, plusWidth
, plusHeight
, remove
, inject
, repl
)
where
import Data.Word
import Graphics.Vty
on :: Color -> Color -> Attr
on a b = def_attr `with_back_color` b `with_fore_color` a
fgColor :: Color -> Attr
fgColor = (def_attr `with_fore_color`)
bgColor :: Color -> Attr
bgColor = (def_attr `with_back_color`)
style :: Style -> Attr
style = (def_attr `with_style`)
mergeAttr :: Attr -> Attr -> Attr
mergeAttr a b =
let b1 = case attr_style a of
SetTo v -> b { attr_style = SetTo v }
_ -> b
b2 = case attr_fore_color a of
SetTo v -> b1 `with_fore_color` v
_ -> b1
b3 = case attr_back_color a of
SetTo v -> b2 `with_back_color` v
_ -> b2
in b3
mergeAttrs :: [Attr] -> Attr
mergeAttrs attrs = foldr mergeAttr def_attr attrs
withWidth :: DisplayRegion -> Word -> DisplayRegion
withWidth (DisplayRegion _ h) w = DisplayRegion w h
withHeight :: DisplayRegion -> Word -> DisplayRegion
withHeight (DisplayRegion w _) h = DisplayRegion w h
plusWidth :: DisplayRegion -> Word -> DisplayRegion
plusWidth (DisplayRegion w' h) w =
if (fromEnum w' + fromEnum w < 0)
then error $ "plusWidth: would overflow on " ++ (show w') ++ " + " ++ (show w)
else DisplayRegion (w + w') h
plusHeight :: DisplayRegion -> Word -> DisplayRegion
plusHeight (DisplayRegion w h') h =
if (fromEnum h' + fromEnum h < 0)
then error $ "plusHeight: would overflow on " ++ (show h') ++ " + " ++ (show h)
else DisplayRegion w (h + h')
remove :: Int -> [a] -> [a]
remove pos as = (take pos as) ++ (drop (pos + 1) as)
inject :: Int -> a -> [a] -> [a]
inject pos a as = let (h, t) = splitAt pos as
in h ++ (a:t)
repl :: Int -> a -> [a] -> [a]
repl pos a as = inject pos a (remove pos as)