packages feed

termbox-bindings-hs-1.0.0: src/Termbox/Bindings/Hs/Internal/InputMode.hs

module Termbox.Bindings.Hs.Internal.InputMode
  ( Tb_input_mode (Tb_input_mode),
    _TB_INPUT_ALT,
    _TB_INPUT_ESC,
    _TB_INPUT_MOUSE,
  )
where

import Data.Bits (Bits, (.|.))
import Data.Coerce (coerce)
import Foreign.C.Types (CInt)
import qualified Termbox.Bindings.C as Termbox

-- | The input mode.
newtype Tb_input_mode
  = Tb_input_mode CInt
  deriving stock (Eq)
  deriving newtype (Bits)

instance Show Tb_input_mode where
  show mode
    | mode == _TB_INPUT_ESC = "_TB_INPUT_ESC"
    | mode == _TB_INPUT_ALT = "_TB_INPUT_ALT"
    | mode == _TB_INPUT_ESC <> _TB_INPUT_MOUSE = "_TB_INPUT_ESC <> _TB_INPUT_MOUSE"
    | mode == _TB_INPUT_ALT <> _TB_INPUT_MOUSE = "_TB_INPUT_ALT <> _TB_INPUT_MOUSE"
    | otherwise = "Tb_input_mode " ++ show (coerce @_ @CInt mode)

instance Semigroup Tb_input_mode where
  (<>) = coerce ((.|.) :: CInt -> CInt -> CInt)

_TB_INPUT_ALT :: Tb_input_mode
_TB_INPUT_ALT =
  Tb_input_mode Termbox._TB_INPUT_ALT

_TB_INPUT_ESC :: Tb_input_mode
_TB_INPUT_ESC =
  Tb_input_mode Termbox._TB_INPUT_ESC

_TB_INPUT_MOUSE :: Tb_input_mode
_TB_INPUT_MOUSE =
  Tb_input_mode Termbox._TB_INPUT_MOUSE