module Termbox.Internal.Key
  ( Key (..),
    parseKey,
    pattern KeyCtrlH,
    pattern KeyCtrlLsqBracket,
    pattern KeyCtrl2,
    pattern KeyCtrl3,
    pattern KeyCtrl4,
    pattern KeyCtrl5,
    pattern KeyCtrl7,
    pattern KeyCtrlM,
    pattern KeyCtrlI,
    pattern KeyCtrlUnderscore,
  )
where

import qualified Termbox.Bindings.Hs

-- | A key event.
--
-- Some distinct key sequences map to the same key event. For example, to a @termbox@ program, @Enter@ is
-- indistinguishable from @Ctrl+M@. Pattern synonyms below are provided for an alternate syntax in these cases, if
-- desired.
data Key
  = KeyChar !Char
  | KeyArrowDown
  | KeyArrowLeft
  | KeyArrowRight
  | KeyArrowUp
  | KeyBackspace
  | -- | Also 'KeyCtrlH'
    KeyCtrlBackspace
  | KeyCtrl6
  | KeyCtrl8
  | KeyCtrlA
  | KeyCtrlB
  | -- | Also 'KeyCtrl4'
    KeyCtrlBackslash
  | KeyCtrlC
  | KeyCtrlD
  | KeyCtrlE
  | KeyCtrlF
  | KeyCtrlG
  | KeyCtrlJ
  | KeyCtrlK
  | KeyCtrlL
  | KeyCtrlN
  | KeyCtrlO
  | KeyCtrlP
  | KeyCtrlQ
  | KeyCtrlR
  | -- | Also 'KeyCtrl5'
    KeyCtrlRsqBracket
  | KeyCtrlS
  | -- | Also 'KeyCtrl7', 'KeyCtrlUnderscore'
    KeyCtrlSlash
  | -- | Also 'KeyCtrl2'
    KeyCtrlTilde
  | KeyCtrlT
  | KeyCtrlU
  | KeyCtrlV
  | KeyCtrlW
  | KeyCtrlX
  | KeyCtrlY
  | KeyCtrlZ
  | KeyDelete
  | KeyEnd
  | -- | Also 'KeyCtrlM'
    KeyEnter
  | -- | Also 'KeyCtrlLsqBracket', 'KeyCtrl3'
    KeyEsc
  | KeyF1
  | KeyF10
  | KeyF11
  | KeyF12
  | KeyF2
  | KeyF3
  | KeyF4
  | KeyF5
  | KeyF6
  | KeyF7
  | KeyF8
  | KeyF9
  | KeyHome
  | KeyInsert
  | KeyPageDn
  | KeyPageUp
  | KeySpace
  | -- | Also 'KeyCtrlI'
    KeyTab
  deriving stock (Key -> Key -> Bool
(Key -> Key -> Bool) -> (Key -> Key -> Bool) -> Eq Key
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Key -> Key -> Bool
== :: Key -> Key -> Bool
$c/= :: Key -> Key -> Bool
/= :: Key -> Key -> Bool
Eq, Eq Key
Eq Key =>
(Key -> Key -> Ordering)
-> (Key -> Key -> Bool)
-> (Key -> Key -> Bool)
-> (Key -> Key -> Bool)
-> (Key -> Key -> Bool)
-> (Key -> Key -> Key)
-> (Key -> Key -> Key)
-> Ord Key
Key -> Key -> Bool
Key -> Key -> Ordering
Key -> Key -> Key
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 :: Key -> Key -> Ordering
compare :: Key -> Key -> Ordering
$c< :: Key -> Key -> Bool
< :: Key -> Key -> Bool
$c<= :: Key -> Key -> Bool
<= :: Key -> Key -> Bool
$c> :: Key -> Key -> Bool
> :: Key -> Key -> Bool
$c>= :: Key -> Key -> Bool
>= :: Key -> Key -> Bool
$cmax :: Key -> Key -> Key
max :: Key -> Key -> Key
$cmin :: Key -> Key -> Key
min :: Key -> Key -> Key
Ord, Int -> Key -> ShowS
[Key] -> ShowS
Key -> [Char]
(Int -> Key -> ShowS)
-> (Key -> [Char]) -> ([Key] -> ShowS) -> Show Key
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Key -> ShowS
showsPrec :: Int -> Key -> ShowS
$cshow :: Key -> [Char]
show :: Key -> [Char]
$cshowList :: [Key] -> ShowS
showList :: [Key] -> ShowS
Show)

pattern KeyCtrlH :: Key
pattern $mKeyCtrlH :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
$bKeyCtrlH :: Key
KeyCtrlH = KeyCtrlBackspace

pattern KeyCtrlLsqBracket :: Key
pattern $mKeyCtrlLsqBracket :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
$bKeyCtrlLsqBracket :: Key
KeyCtrlLsqBracket = KeyEsc

pattern KeyCtrl2 :: Key
pattern $mKeyCtrl2 :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
$bKeyCtrl2 :: Key
KeyCtrl2 = KeyCtrlTilde

pattern KeyCtrl3 :: Key
pattern $mKeyCtrl3 :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
$bKeyCtrl3 :: Key
KeyCtrl3 = KeyEsc

pattern KeyCtrl4 :: Key
pattern $mKeyCtrl4 :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
$bKeyCtrl4 :: Key
KeyCtrl4 = KeyCtrlBackslash

pattern KeyCtrl5 :: Key
pattern $mKeyCtrl5 :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
$bKeyCtrl5 :: Key
KeyCtrl5 = KeyCtrlRsqBracket

pattern KeyCtrl7 :: Key
pattern $mKeyCtrl7 :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
$bKeyCtrl7 :: Key
KeyCtrl7 = KeyCtrlSlash

pattern KeyCtrlM :: Key
pattern $mKeyCtrlM :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
$bKeyCtrlM :: Key
KeyCtrlM = KeyEnter

pattern KeyCtrlI :: Key
pattern $mKeyCtrlI :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
$bKeyCtrlI :: Key
KeyCtrlI = KeyTab

pattern KeyCtrlUnderscore :: Key
pattern $mKeyCtrlUnderscore :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
$bKeyCtrlUnderscore :: Key
KeyCtrlUnderscore = KeyCtrlSlash

parseKey :: Termbox.Bindings.Hs.Tb_key -> Key
parseKey :: Tb_key -> Key
parseKey = \case
  Tb_key
Termbox.Bindings.Hs.TB_KEY_ARROW_DOWN -> Key
KeyArrowDown
  Tb_key
Termbox.Bindings.Hs.TB_KEY_ARROW_LEFT -> Key
KeyArrowLeft
  Tb_key
Termbox.Bindings.Hs.TB_KEY_ARROW_RIGHT -> Key
KeyArrowRight
  Tb_key
Termbox.Bindings.Hs.TB_KEY_ARROW_UP -> Key
KeyArrowUp
  Tb_key
Termbox.Bindings.Hs.TB_KEY_BACKSPACE -> Key
KeyBackspace
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_TILDE -> Key
KeyCtrlTilde
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_6 -> Key
KeyCtrl6
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_8 -> Key
KeyCtrl8
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_A -> Key
KeyCtrlA
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_B -> Key
KeyCtrlB
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_BACKSLASH -> Key
KeyCtrlBackslash
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_C -> Key
KeyCtrlC
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_D -> Key
KeyCtrlD
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_E -> Key
KeyCtrlE
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_F -> Key
KeyCtrlF
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_G -> Key
KeyCtrlG
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_H -> Key
KeyCtrlBackspace
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_J -> Key
KeyCtrlJ
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_K -> Key
KeyCtrlK
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_L -> Key
KeyCtrlL
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_N -> Key
KeyCtrlN
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_O -> Key
KeyCtrlO
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_P -> Key
KeyCtrlP
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_Q -> Key
KeyCtrlQ
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_R -> Key
KeyCtrlR
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_RSQ_BRACKET -> Key
KeyCtrlRsqBracket
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_S -> Key
KeyCtrlS
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_SLASH -> Key
KeyCtrlSlash
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_T -> Key
KeyCtrlT
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_U -> Key
KeyCtrlU
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_V -> Key
KeyCtrlV
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_W -> Key
KeyCtrlW
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_X -> Key
KeyCtrlX
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_Y -> Key
KeyCtrlY
  Tb_key
Termbox.Bindings.Hs.TB_KEY_CTRL_Z -> Key
KeyCtrlZ
  Tb_key
Termbox.Bindings.Hs.TB_KEY_DELETE -> Key
KeyDelete
  Tb_key
Termbox.Bindings.Hs.TB_KEY_END -> Key
KeyEnd
  Tb_key
Termbox.Bindings.Hs.TB_KEY_ENTER -> Key
KeyEnter
  Tb_key
Termbox.Bindings.Hs.TB_KEY_ESC -> Key
KeyEsc
  Tb_key
Termbox.Bindings.Hs.TB_KEY_F1 -> Key
KeyF1
  Tb_key
Termbox.Bindings.Hs.TB_KEY_F10 -> Key
KeyF10
  Tb_key
Termbox.Bindings.Hs.TB_KEY_F11 -> Key
KeyF11
  Tb_key
Termbox.Bindings.Hs.TB_KEY_F12 -> Key
KeyF12
  Tb_key
Termbox.Bindings.Hs.TB_KEY_F2 -> Key
KeyF2
  Tb_key
Termbox.Bindings.Hs.TB_KEY_F3 -> Key
KeyF3
  Tb_key
Termbox.Bindings.Hs.TB_KEY_F4 -> Key
KeyF4
  Tb_key
Termbox.Bindings.Hs.TB_KEY_F5 -> Key
KeyF5
  Tb_key
Termbox.Bindings.Hs.TB_KEY_F6 -> Key
KeyF6
  Tb_key
Termbox.Bindings.Hs.TB_KEY_F7 -> Key
KeyF7
  Tb_key
Termbox.Bindings.Hs.TB_KEY_F8 -> Key
KeyF8
  Tb_key
Termbox.Bindings.Hs.TB_KEY_F9 -> Key
KeyF9
  Tb_key
Termbox.Bindings.Hs.TB_KEY_HOME -> Key
KeyHome
  Tb_key
Termbox.Bindings.Hs.TB_KEY_INSERT -> Key
KeyInsert
  Tb_key
Termbox.Bindings.Hs.TB_KEY_PGDN -> Key
KeyPageDn
  Tb_key
Termbox.Bindings.Hs.TB_KEY_PGUP -> Key
KeyPageUp
  Tb_key
Termbox.Bindings.Hs.TB_KEY_SPACE -> Key
KeySpace
  Tb_key
Termbox.Bindings.Hs.TB_KEY_TAB -> Key
KeyTab
  Tb_key
key -> [Char] -> Key
forall a. HasCallStack => [Char] -> a
error ([Char]
"unknown key: " [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ Tb_key -> [Char]
forall a. Show a => a -> [Char]
show Tb_key
key)