module BearLibTerminal.Terminal.CString
( terminalSetCString
, terminalSetCString_
, terminalColorNameCString
, terminalBkColorNameCString
, terminalPrintCString
, terminalPrintExtCString
, terminalMeasureCString
, terminalMeasureExtCString
) where
import BearLibTerminal.Raw
import Control.Monad.IO.Class
import Data.Function ((&))
import Data.Maybe (fromMaybe)
import Foreign
import Foreign.C.String
import Foreign.C.Types (CInt)
terminalSetCString :: MonadIO m =>
CString
-> m Bool
terminalSetCString :: forall (m :: * -> *). MonadIO m => CString -> m Bool
terminalSetCString = IO Bool -> m Bool
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Bool -> m Bool) -> (CString -> IO Bool) -> CString -> m Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((CInt -> Bool) -> IO CInt -> IO Bool
forall a b. (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap CInt -> Bool
asBool (IO CInt -> IO Bool) -> (CString -> IO CInt) -> CString -> IO Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CString -> IO CInt
c_terminal_set)
terminalSetCString_ :: MonadIO m =>
CString
-> m ()
terminalSetCString_ :: forall (m :: * -> *). MonadIO m => CString -> m ()
terminalSetCString_ = IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> (CString -> IO ()) -> CString -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (IO CInt -> IO ()
forall a. IO a -> IO ()
void (IO CInt -> IO ()) -> (CString -> IO CInt) -> CString -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CString -> IO CInt
c_terminal_set)
terminalColorNameCString ::
MonadIO m
=> CString
-> m ()
terminalColorNameCString :: forall (m :: * -> *). MonadIO m => CString -> m ()
terminalColorNameCString = IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> (CString -> IO ()) -> CString -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CString -> IO ()
c_terminal_color_from_name
terminalBkColorNameCString ::
MonadIO m
=> CString
-> m ()
terminalBkColorNameCString :: forall (m :: * -> *). MonadIO m => CString -> m ()
terminalBkColorNameCString = IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> (CString -> IO ()) -> CString -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CString -> IO ()
c_terminal_bkcolor_from_name
terminalPrintCString ::
MonadIO m
=> Int
-> Int
-> CString
-> m Dimensions
terminalPrintCString :: forall (m :: * -> *).
MonadIO m =>
Int -> Int -> CString -> m Dimensions
terminalPrintCString Int
x Int
y CString
c = IO Dimensions -> m Dimensions
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Dimensions -> m Dimensions) -> IO Dimensions -> m Dimensions
forall a b. (a -> b) -> a -> b
$ (Ptr Dimensions -> IO Dimensions) -> IO Dimensions
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca (\Ptr Dimensions
dim -> CInt -> CInt -> CString -> Ptr Dimensions -> IO ()
c_terminal_print_ptr (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
x) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
y) CString
c Ptr Dimensions
dim IO () -> IO Dimensions -> IO Dimensions
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Ptr Dimensions -> IO Dimensions
forall a. Storable a => Ptr a -> IO a
peek Ptr Dimensions
dim)
terminalPrintExtCString ::
MonadIO m
=> Int
-> Int
-> Int
-> Int
-> Maybe PrintAlignment
-> CString
-> m Dimensions
terminalPrintExtCString :: forall (m :: * -> *).
MonadIO m =>
Int
-> Int
-> Int
-> Int
-> Maybe PrintAlignment
-> CString
-> m Dimensions
terminalPrintExtCString Int
x Int
y Int
w Int
h Maybe PrintAlignment
mbAlign CString
c =
let align :: CInt
align :: CInt
align = PrintAlignment -> Maybe PrintAlignment -> PrintAlignment
forall a. a -> Maybe a -> a
fromMaybe PrintAlignment
AlignDefault Maybe PrintAlignment
mbAlign PrintAlignment -> (PrintAlignment -> CInt) -> CInt
forall a b. a -> (a -> b) -> b
& \case
PrintAlignment
AlignDefault -> CInt
0
PrintAlignment
AlignLeft -> CInt
1
PrintAlignment
AlignRight -> CInt
2
PrintAlignment
AlignCenter -> CInt
3
PrintAlignment
AlignTop -> CInt
4
PrintAlignment
AlignBottom -> CInt
8
PrintAlignment
AlignMiddle -> CInt
12
in
IO Dimensions -> m Dimensions
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Dimensions -> m Dimensions) -> IO Dimensions -> m Dimensions
forall a b. (a -> b) -> a -> b
$ (Ptr Dimensions -> IO Dimensions) -> IO Dimensions
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca (\Ptr Dimensions
dim -> CInt
-> CInt
-> CInt
-> CInt
-> CInt
-> CString
-> Ptr Dimensions
-> IO ()
c_terminal_print_ext_ptr (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
x) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
y) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
w) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
h) CInt
align CString
c Ptr Dimensions
dim IO () -> IO Dimensions -> IO Dimensions
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Ptr Dimensions -> IO Dimensions
forall a. Storable a => Ptr a -> IO a
peek Ptr Dimensions
dim)
terminalMeasureCString ::
MonadIO m
=> CString
-> m Dimensions
terminalMeasureCString :: forall (m :: * -> *). MonadIO m => CString -> m Dimensions
terminalMeasureCString CString
c = IO Dimensions -> m Dimensions
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Dimensions -> m Dimensions) -> IO Dimensions -> m Dimensions
forall a b. (a -> b) -> a -> b
$ (Ptr Dimensions -> IO Dimensions) -> IO Dimensions
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca (\Ptr Dimensions
dim -> CString -> Ptr Dimensions -> IO ()
c_terminal_measure_ptr CString
c Ptr Dimensions
dim IO () -> IO Dimensions -> IO Dimensions
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Ptr Dimensions -> IO Dimensions
forall a. Storable a => Ptr a -> IO a
peek Ptr Dimensions
dim)
terminalMeasureExtCString ::
MonadIO m
=> Int
-> Int
-> CString
-> m Dimensions
terminalMeasureExtCString :: forall (m :: * -> *).
MonadIO m =>
Int -> Int -> CString -> m Dimensions
terminalMeasureExtCString Int
w Int
h CString
c = IO Dimensions -> m Dimensions
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Dimensions -> m Dimensions) -> IO Dimensions -> m Dimensions
forall a b. (a -> b) -> a -> b
$ (Ptr Dimensions -> IO Dimensions) -> IO Dimensions
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca (\Ptr Dimensions
dim -> CInt -> CInt -> CString -> Ptr Dimensions -> IO ()
c_terminal_measure_ext_ptr (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
w) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
h) CString
c Ptr Dimensions
dim IO () -> IO Dimensions -> IO Dimensions
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Ptr Dimensions -> IO Dimensions
forall a. Storable a => Ptr a -> IO a
peek Ptr Dimensions
dim)