{-# LANGUAGE CApiFFI #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE DuplicateRecordFields #-}
module BearLibTerminal.Raw where
import Foreign.C.Types
import Foreign.C.String
import Foreign.Ptr
import Foreign.Storable
import Control.Monad.IO.Class
import Data.Text (Text)
import qualified Data.Text.Foreign as TF
import GHC.Generics
data Dimensions = Dimensions
{ Dimensions -> Int
width :: Int
, Dimensions -> Int
height :: Int
} deriving stock (Int -> Dimensions -> ShowS
[Dimensions] -> ShowS
Dimensions -> String
(Int -> Dimensions -> ShowS)
-> (Dimensions -> String)
-> ([Dimensions] -> ShowS)
-> Show Dimensions
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Dimensions -> ShowS
showsPrec :: Int -> Dimensions -> ShowS
$cshow :: Dimensions -> String
show :: Dimensions -> String
$cshowList :: [Dimensions] -> ShowS
showList :: [Dimensions] -> ShowS
Show, (forall x. Dimensions -> Rep Dimensions x)
-> (forall x. Rep Dimensions x -> Dimensions) -> Generic Dimensions
forall x. Rep Dimensions x -> Dimensions
forall x. Dimensions -> Rep Dimensions x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Dimensions -> Rep Dimensions x
from :: forall x. Dimensions -> Rep Dimensions x
$cto :: forall x. Rep Dimensions x -> Dimensions
to :: forall x. Rep Dimensions x -> Dimensions
Generic, Dimensions -> Dimensions -> Bool
(Dimensions -> Dimensions -> Bool)
-> (Dimensions -> Dimensions -> Bool) -> Eq Dimensions
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Dimensions -> Dimensions -> Bool
== :: Dimensions -> Dimensions -> Bool
$c/= :: Dimensions -> Dimensions -> Bool
/= :: Dimensions -> Dimensions -> Bool
Eq, Eq Dimensions
Eq Dimensions =>
(Dimensions -> Dimensions -> Ordering)
-> (Dimensions -> Dimensions -> Bool)
-> (Dimensions -> Dimensions -> Bool)
-> (Dimensions -> Dimensions -> Bool)
-> (Dimensions -> Dimensions -> Bool)
-> (Dimensions -> Dimensions -> Dimensions)
-> (Dimensions -> Dimensions -> Dimensions)
-> Ord Dimensions
Dimensions -> Dimensions -> Bool
Dimensions -> Dimensions -> Ordering
Dimensions -> Dimensions -> Dimensions
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Dimensions -> Dimensions -> Ordering
compare :: Dimensions -> Dimensions -> Ordering
$c< :: Dimensions -> Dimensions -> Bool
< :: Dimensions -> Dimensions -> Bool
$c<= :: Dimensions -> Dimensions -> Bool
<= :: Dimensions -> Dimensions -> Bool
$c> :: Dimensions -> Dimensions -> Bool
> :: Dimensions -> Dimensions -> Bool
$c>= :: Dimensions -> Dimensions -> Bool
>= :: Dimensions -> Dimensions -> Bool
$cmax :: Dimensions -> Dimensions -> Dimensions
max :: Dimensions -> Dimensions -> Dimensions
$cmin :: Dimensions -> Dimensions -> Dimensions
min :: Dimensions -> Dimensions -> Dimensions
Ord, ReadPrec [Dimensions]
ReadPrec Dimensions
Int -> ReadS Dimensions
ReadS [Dimensions]
(Int -> ReadS Dimensions)
-> ReadS [Dimensions]
-> ReadPrec Dimensions
-> ReadPrec [Dimensions]
-> Read Dimensions
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS Dimensions
readsPrec :: Int -> ReadS Dimensions
$creadList :: ReadS [Dimensions]
readList :: ReadS [Dimensions]
$creadPrec :: ReadPrec Dimensions
readPrec :: ReadPrec Dimensions
$creadListPrec :: ReadPrec [Dimensions]
readListPrec :: ReadPrec [Dimensions]
Read)
instance Storable Dimensions where
sizeOf :: Dimensions -> Int
sizeOf Dimensions
_ = Int
8
alignment :: Dimensions -> Int
alignment Dimensions
_ = Int
4
poke :: Ptr Dimensions -> Dimensions -> IO ()
poke Ptr Dimensions
p Dimensions{Int
width :: Dimensions -> Int
height :: Dimensions -> Int
width :: Int
height :: Int
..} = do
Ptr Dimensions -> Int -> Int -> IO ()
forall b. Ptr b -> Int -> Int -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Dimensions
p Int
0 Int
width
Ptr Dimensions -> Int -> Int -> IO ()
forall b. Ptr b -> Int -> Int -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Dimensions
p Int
4 Int
height
peek :: Ptr Dimensions -> IO Dimensions
peek Ptr Dimensions
p = do
(width :: CUInt) <- Ptr Dimensions -> Int -> IO CUInt
forall b. Ptr b -> Int -> IO CUInt
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr Dimensions
p Int
0
(height :: CUInt) <- peekByteOff p 4
return $ Dimensions (fromIntegral width) (fromIntegral height)
data PrintAlignment = AlignDefault | AlignLeft | AlignRight | AlignCenter | AlignTop | AlignBottom | AlignMiddle
deriving stock (PrintAlignment -> PrintAlignment -> Bool
(PrintAlignment -> PrintAlignment -> Bool)
-> (PrintAlignment -> PrintAlignment -> Bool) -> Eq PrintAlignment
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PrintAlignment -> PrintAlignment -> Bool
== :: PrintAlignment -> PrintAlignment -> Bool
$c/= :: PrintAlignment -> PrintAlignment -> Bool
/= :: PrintAlignment -> PrintAlignment -> Bool
Eq, Eq PrintAlignment
Eq PrintAlignment =>
(PrintAlignment -> PrintAlignment -> Ordering)
-> (PrintAlignment -> PrintAlignment -> Bool)
-> (PrintAlignment -> PrintAlignment -> Bool)
-> (PrintAlignment -> PrintAlignment -> Bool)
-> (PrintAlignment -> PrintAlignment -> Bool)
-> (PrintAlignment -> PrintAlignment -> PrintAlignment)
-> (PrintAlignment -> PrintAlignment -> PrintAlignment)
-> Ord PrintAlignment
PrintAlignment -> PrintAlignment -> Bool
PrintAlignment -> PrintAlignment -> Ordering
PrintAlignment -> PrintAlignment -> PrintAlignment
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: PrintAlignment -> PrintAlignment -> Ordering
compare :: PrintAlignment -> PrintAlignment -> Ordering
$c< :: PrintAlignment -> PrintAlignment -> Bool
< :: PrintAlignment -> PrintAlignment -> Bool
$c<= :: PrintAlignment -> PrintAlignment -> Bool
<= :: PrintAlignment -> PrintAlignment -> Bool
$c> :: PrintAlignment -> PrintAlignment -> Bool
> :: PrintAlignment -> PrintAlignment -> Bool
$c>= :: PrintAlignment -> PrintAlignment -> Bool
>= :: PrintAlignment -> PrintAlignment -> Bool
$cmax :: PrintAlignment -> PrintAlignment -> PrintAlignment
max :: PrintAlignment -> PrintAlignment -> PrintAlignment
$cmin :: PrintAlignment -> PrintAlignment -> PrintAlignment
min :: PrintAlignment -> PrintAlignment -> PrintAlignment
Ord, PrintAlignment
PrintAlignment -> PrintAlignment -> Bounded PrintAlignment
forall a. a -> a -> Bounded a
$cminBound :: PrintAlignment
minBound :: PrintAlignment
$cmaxBound :: PrintAlignment
maxBound :: PrintAlignment
Bounded, Int -> PrintAlignment
PrintAlignment -> Int
PrintAlignment -> [PrintAlignment]
PrintAlignment -> PrintAlignment
PrintAlignment -> PrintAlignment -> [PrintAlignment]
PrintAlignment
-> PrintAlignment -> PrintAlignment -> [PrintAlignment]
(PrintAlignment -> PrintAlignment)
-> (PrintAlignment -> PrintAlignment)
-> (Int -> PrintAlignment)
-> (PrintAlignment -> Int)
-> (PrintAlignment -> [PrintAlignment])
-> (PrintAlignment -> PrintAlignment -> [PrintAlignment])
-> (PrintAlignment -> PrintAlignment -> [PrintAlignment])
-> (PrintAlignment
-> PrintAlignment -> PrintAlignment -> [PrintAlignment])
-> Enum PrintAlignment
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: PrintAlignment -> PrintAlignment
succ :: PrintAlignment -> PrintAlignment
$cpred :: PrintAlignment -> PrintAlignment
pred :: PrintAlignment -> PrintAlignment
$ctoEnum :: Int -> PrintAlignment
toEnum :: Int -> PrintAlignment
$cfromEnum :: PrintAlignment -> Int
fromEnum :: PrintAlignment -> Int
$cenumFrom :: PrintAlignment -> [PrintAlignment]
enumFrom :: PrintAlignment -> [PrintAlignment]
$cenumFromThen :: PrintAlignment -> PrintAlignment -> [PrintAlignment]
enumFromThen :: PrintAlignment -> PrintAlignment -> [PrintAlignment]
$cenumFromTo :: PrintAlignment -> PrintAlignment -> [PrintAlignment]
enumFromTo :: PrintAlignment -> PrintAlignment -> [PrintAlignment]
$cenumFromThenTo :: PrintAlignment
-> PrintAlignment -> PrintAlignment -> [PrintAlignment]
enumFromThenTo :: PrintAlignment
-> PrintAlignment -> PrintAlignment -> [PrintAlignment]
Enum, (forall x. PrintAlignment -> Rep PrintAlignment x)
-> (forall x. Rep PrintAlignment x -> PrintAlignment)
-> Generic PrintAlignment
forall x. Rep PrintAlignment x -> PrintAlignment
forall x. PrintAlignment -> Rep PrintAlignment x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. PrintAlignment -> Rep PrintAlignment x
from :: forall x. PrintAlignment -> Rep PrintAlignment x
$cto :: forall x. Rep PrintAlignment x -> PrintAlignment
to :: forall x. Rep PrintAlignment x -> PrintAlignment
Generic, Int -> PrintAlignment -> ShowS
[PrintAlignment] -> ShowS
PrintAlignment -> String
(Int -> PrintAlignment -> ShowS)
-> (PrintAlignment -> String)
-> ([PrintAlignment] -> ShowS)
-> Show PrintAlignment
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> PrintAlignment -> ShowS
showsPrec :: Int -> PrintAlignment -> ShowS
$cshow :: PrintAlignment -> String
show :: PrintAlignment -> String
$cshowList :: [PrintAlignment] -> ShowS
showList :: [PrintAlignment] -> ShowS
Show, ReadPrec [PrintAlignment]
ReadPrec PrintAlignment
Int -> ReadS PrintAlignment
ReadS [PrintAlignment]
(Int -> ReadS PrintAlignment)
-> ReadS [PrintAlignment]
-> ReadPrec PrintAlignment
-> ReadPrec [PrintAlignment]
-> Read PrintAlignment
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS PrintAlignment
readsPrec :: Int -> ReadS PrintAlignment
$creadList :: ReadS [PrintAlignment]
readList :: ReadS [PrintAlignment]
$creadPrec :: ReadPrec PrintAlignment
readPrec :: ReadPrec PrintAlignment
$creadListPrec :: ReadPrec [PrintAlignment]
readListPrec :: ReadPrec [PrintAlignment]
Read)
asBool :: CInt -> Bool
asBool :: CInt -> Bool
asBool = (CInt -> CInt -> Bool
forall a. Eq a => a -> a -> Bool
== CInt
1)
foreign import capi safe "BearLibTerminal.h terminal_open" c_terminal_open :: IO CInt
foreign import capi safe "BearLibTerminal.h terminal_close" c_terminal_close :: IO ()
foreign import capi safe "BearLibTerminal.h terminal_set" c_terminal_set :: CString -> IO CInt
textToCString :: MonadIO m => (CString -> IO a) -> Text -> m a
textToCString :: forall (m :: * -> *) a.
MonadIO m =>
(CString -> IO a) -> Text -> m a
textToCString CString -> IO a
f = IO a -> m a
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO a -> m a) -> (Text -> IO a) -> Text -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Text -> (CString -> IO a) -> IO a)
-> (CString -> IO a) -> Text -> IO a
forall a b c. (a -> b -> c) -> b -> a -> c
flip Text -> (CString -> IO a) -> IO a
forall a. Text -> (CString -> IO a) -> IO a
TF.withCString CString -> IO a
f
stringToCString :: MonadIO m => (CString -> IO a) -> String -> m a
stringToCString :: forall (m :: * -> *) a.
MonadIO m =>
(CString -> IO a) -> String -> m a
stringToCString CString -> IO a
f = IO a -> m a
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO a -> m a) -> (String -> IO a) -> String -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> (CString -> IO a) -> IO a)
-> (CString -> IO a) -> String -> IO a
forall a b c. (a -> b -> c) -> b -> a -> c
flip String -> (CString -> IO a) -> IO a
forall a. String -> (CString -> IO a) -> IO a
withCString CString -> IO a
f
surround :: Semigroup a => a -> a -> a -> a
surround :: forall a. Semigroup a => a -> a -> a -> a
surround a
p a
s a
t = a
p a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
t a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
s
foreign import capi safe "BearLibTerminal.h terminal_color" c_terminal_color_uint :: CUInt -> IO ()
foreign import capi safe "BearLibTerminalExtras.h terminal_color_from_name" c_terminal_color_from_name :: CString -> IO ()
foreign import capi safe "BearLibTerminal.h terminal_bkcolor" c_terminal_bkcolor_uint :: CUInt -> IO ()
foreign import capi safe "BearLibTerminalExtras.h terminal_bkcolor_from_name" c_terminal_bkcolor_from_name :: CString -> IO ()
foreign import capi safe "BearLibTerminal.h terminal_composition" c_terminal_composition :: CInt -> IO ()
foreign import capi safe "BearLibTerminal.h terminal_layer" c_terminal_layer :: CInt -> IO ()
foreign import capi safe "BearLibTerminal.h terminal_clear" c_terminal_clear :: IO ()
foreign import capi safe "BearLibTerminal.h terminal_clear_area" c_terminal_clear_area :: CInt -> CInt -> CInt -> CInt -> IO ()
foreign import capi safe "BearLibTerminal.h terminal_crop" c_terminal_crop :: CInt -> CInt -> CInt -> CInt -> IO ()
foreign import capi safe "BearLibTerminal.h terminal_refresh" c_terminal_refresh :: IO ()
foreign import capi safe "BearLibTerminal.h terminal_put" c_terminal_put :: CInt -> CInt -> CInt -> IO ()
foreign import capi safe "BearLibTerminal.h terminal_pick" c_terminal_pick :: CInt -> CInt -> CInt -> IO CInt
foreign import capi safe "BearLibTerminal.h terminal_pick_color" c_terminal_pick_color :: CInt -> CInt -> CInt -> IO CUInt
foreign import capi safe "BearLibTerminal.h terminal_pick_bkcolor" c_terminal_pick_bkcolor :: CInt -> CInt -> IO CUInt
foreign import capi safe "BearLibTerminal.h terminal_put_ext" c_terminal_put_ext :: CInt -> CInt -> CInt -> CInt -> CInt -> Ptr CUInt -> IO ()
foreign import capi safe "BearLibTerminalExtras.h terminal_print_ptr" c_terminal_print_ptr :: CInt -> CInt -> CString -> Ptr Dimensions -> IO ()
foreign import capi safe "BearLibTerminalExtras.h terminal_print_ext_ptr" c_terminal_print_ext_ptr :: CInt -> CInt -> CInt -> CInt -> CInt -> CString -> Ptr Dimensions -> IO ()
foreign import capi safe "BearLibTerminalExtras.h terminal_measure_ptr" c_terminal_measure_ptr :: CString -> Ptr Dimensions -> IO ()
foreign import capi safe "BearLibTerminalExtras.h terminal_measure_ext_ptr" c_terminal_measure_ext_ptr :: CInt -> CInt -> CString -> Ptr Dimensions -> IO ()
foreign import capi safe "BearLibTerminal.h terminal_state" c_terminal_state :: CInt -> IO CInt
foreign import capi safe "BearLibTerminal.h terminal_has_input" c_terminal_has_input :: IO CInt
foreign import capi safe "BearLibTerminal.h terminal_read" c_terminal_read :: IO CInt
foreign import capi safe "BearLibTerminal.h terminal_peek" c_terminal_peek :: IO CInt
foreign import capi safe "BearLibTerminal.h terminal_read_str" c_read_str :: CInt -> CInt -> Ptr CChar -> CInt -> IO CUInt
foreign import capi safe "BearLibTerminal.h terminal_delay" c_terminal_delay :: CInt -> IO ()