module Termbox.Internal.Cell
(
Cell,
drawCell,
char,
fg,
bg,
bold,
underline,
blink,
)
where
import qualified Data.Char as Char
import Data.String (IsString (..))
import Foreign.C.Types (CInt (CInt), CWchar (CWchar))
import qualified Termbox.Bindings.Hs
import Termbox.Internal.Color (Color (Color))
data Cell
= CellFg
{-# UNPACK #-} !Char
{-# UNPACK #-} !Termbox.Bindings.Hs.Tb_color
| CellFgBlink
{-# UNPACK #-} !Char
{-# UNPACK #-} !Termbox.Bindings.Hs.Tb_color
| CellFgBg
{-# UNPACK #-} !Char
{-# UNPACK #-} !Termbox.Bindings.Hs.Tb_color
{-# UNPACK #-} !Termbox.Bindings.Hs.Tb_color
instance {-# OVERLAPS #-} IsString [Cell] where
fromString :: String -> [Cell]
fromString =
forall a b. (a -> b) -> [a] -> [b]
map Char -> Cell
char
drawCell :: Termbox.Bindings.Hs.Tb_color -> Int -> Int -> Cell -> IO ()
drawCell :: Tb_color -> Int -> Int -> Cell -> IO ()
drawCell Tb_color
bg0 Int
col Int
row = \case
CellFg Char
ch Tb_color
fg_ -> Int -> Int -> Char -> Tb_color -> Tb_color -> IO ()
Termbox.Bindings.Hs.tb_change_cell Int
col Int
row Char
ch Tb_color
fg_ Tb_color
bg0
CellFgBlink Char
ch Tb_color
fg_ -> Int -> Int -> Char -> Tb_color -> Tb_color -> IO ()
Termbox.Bindings.Hs.tb_change_cell Int
col Int
row Char
ch Tb_color
fg_ (Tb_color -> Tb_color
makeBold Tb_color
bg0)
CellFgBg Char
ch Tb_color
fg_ Tb_color
bg_ -> Int -> Int -> Char -> Tb_color -> Tb_color -> IO ()
Termbox.Bindings.Hs.tb_change_cell Int
col Int
row Char
ch Tb_color
fg_ Tb_color
bg_
char :: Char -> Cell
char :: Char -> Cell
char Char
ch =
Char -> Tb_color -> Cell
CellFg (if CWchar -> CInt
wcwidth (Char -> CWchar
charToCWchar Char
ch) forall a. Eq a => a -> a -> Bool
== CInt
1 then Char
ch else Char
' ') Tb_color
Termbox.Bindings.Hs.TB_DEFAULT
fg :: Color -> Cell -> Cell
fg :: Color -> Cell -> Cell
fg (Color Tb_color
color) = \case
CellFg Char
ch Tb_color
_ -> Char -> Tb_color -> Cell
CellFg Char
ch Tb_color
color
CellFgBlink Char
ch Tb_color
_ -> Char -> Tb_color -> Cell
CellFgBlink Char
ch Tb_color
color
CellFgBg Char
ch Tb_color
_ Tb_color
bg_ -> Char -> Tb_color -> Tb_color -> Cell
CellFgBg Char
ch Tb_color
color Tb_color
bg_
bg :: Color -> Cell -> Cell
bg :: Color -> Cell -> Cell
bg (Color Tb_color
color) = \case
CellFg Char
ch Tb_color
fg_ -> Char -> Tb_color -> Tb_color -> Cell
CellFgBg Char
ch Tb_color
fg_ Tb_color
color
CellFgBlink Char
ch Tb_color
fg_ -> Char -> Tb_color -> Tb_color -> Cell
CellFgBg Char
ch Tb_color
fg_ (Tb_color -> Tb_color
makeBold Tb_color
color)
CellFgBg Char
ch Tb_color
fg_ Tb_color
_ -> Char -> Tb_color -> Tb_color -> Cell
CellFgBg Char
ch Tb_color
fg_ Tb_color
color
bold :: Cell -> Cell
bold :: Cell -> Cell
bold = \case
CellFg Char
ch Tb_color
fg_ -> Char -> Tb_color -> Cell
CellFg Char
ch (Tb_color -> Tb_color
makeBold Tb_color
fg_)
CellFgBlink Char
ch Tb_color
fg_ -> Char -> Tb_color -> Cell
CellFgBlink Char
ch (Tb_color -> Tb_color
makeBold Tb_color
fg_)
CellFgBg Char
ch Tb_color
fg_ Tb_color
bg_ -> Char -> Tb_color -> Tb_color -> Cell
CellFgBg Char
ch (Tb_color -> Tb_color
makeBold Tb_color
fg_) Tb_color
bg_
underline :: Cell -> Cell
underline :: Cell -> Cell
underline = \case
CellFg Char
ch Tb_color
fg_ -> Char -> Tb_color -> Cell
CellFg Char
ch (Tb_color -> Tb_color
makeUnderline Tb_color
fg_)
CellFgBlink Char
ch Tb_color
fg_ -> Char -> Tb_color -> Cell
CellFgBlink Char
ch (Tb_color -> Tb_color
makeUnderline Tb_color
fg_)
CellFgBg Char
ch Tb_color
fg_ Tb_color
bg_ -> Char -> Tb_color -> Tb_color -> Cell
CellFgBg Char
ch (Tb_color -> Tb_color
makeUnderline Tb_color
fg_) Tb_color
bg_
blink :: Cell -> Cell
blink :: Cell -> Cell
blink = \case
CellFg Char
ch Tb_color
fg_ -> Char -> Tb_color -> Cell
CellFgBlink Char
ch Tb_color
fg_
CellFgBlink Char
ch Tb_color
fg_ -> Char -> Tb_color -> Cell
CellFgBlink Char
ch Tb_color
fg_
CellFgBg Char
ch Tb_color
fg_ Tb_color
bg_ -> Char -> Tb_color -> Tb_color -> Cell
CellFgBg Char
ch Tb_color
fg_ (Tb_color -> Tb_color
makeBold Tb_color
bg_)
makeBold :: Termbox.Bindings.Hs.Tb_color -> Termbox.Bindings.Hs.Tb_color
makeBold :: Tb_color -> Tb_color
makeBold =
Tb_attr -> Tb_color -> Tb_color
Termbox.Bindings.Hs.tb_attr Tb_attr
Termbox.Bindings.Hs.TB_BOLD
makeUnderline :: Termbox.Bindings.Hs.Tb_color -> Termbox.Bindings.Hs.Tb_color
makeUnderline :: Tb_color -> Tb_color
makeUnderline =
Tb_attr -> Tb_color -> Tb_color
Termbox.Bindings.Hs.tb_attr Tb_attr
Termbox.Bindings.Hs.TB_UNDERLINE
charToCWchar :: Char -> CWchar
charToCWchar :: Char -> CWchar
charToCWchar =
forall a b. (Integral a, Num b) => a -> b
fromIntegral @Int @CWchar forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Int
Char.ord
foreign import capi unsafe "wchar.h wcwidth"
wcwidth :: CWchar -> CInt