{-# LANGUAGE RecordWildCards, LambdaCase #-}
module RetroClash.PS2.ASCII
    ( Side(..), Modifier(..)
    , modMap
    , asciiMap
    ) where

import Clash.Prelude
import RetroClash.PS2
import Data.Char

data Side
    = OnLeft
    | OnRight
    deriving (Side -> Side -> Bool
(Side -> Side -> Bool) -> (Side -> Side -> Bool) -> Eq Side
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Side -> Side -> Bool
== :: Side -> Side -> Bool
$c/= :: Side -> Side -> Bool
/= :: Side -> Side -> Bool
Eq, Int -> Side -> ShowS
[Side] -> ShowS
Side -> String
(Int -> Side -> ShowS)
-> (Side -> String) -> ([Side] -> ShowS) -> Show Side
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Side -> ShowS
showsPrec :: Int -> Side -> ShowS
$cshow :: Side -> String
show :: Side -> String
$cshowList :: [Side] -> ShowS
showList :: [Side] -> ShowS
Show, Int -> Side
Side -> Int
Side -> [Side]
Side -> Side
Side -> Side -> [Side]
Side -> Side -> Side -> [Side]
(Side -> Side)
-> (Side -> Side)
-> (Int -> Side)
-> (Side -> Int)
-> (Side -> [Side])
-> (Side -> Side -> [Side])
-> (Side -> Side -> [Side])
-> (Side -> Side -> Side -> [Side])
-> Enum Side
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 :: Side -> Side
succ :: Side -> Side
$cpred :: Side -> Side
pred :: Side -> Side
$ctoEnum :: Int -> Side
toEnum :: Int -> Side
$cfromEnum :: Side -> Int
fromEnum :: Side -> Int
$cenumFrom :: Side -> [Side]
enumFrom :: Side -> [Side]
$cenumFromThen :: Side -> Side -> [Side]
enumFromThen :: Side -> Side -> [Side]
$cenumFromTo :: Side -> Side -> [Side]
enumFromTo :: Side -> Side -> [Side]
$cenumFromThenTo :: Side -> Side -> Side -> [Side]
enumFromThenTo :: Side -> Side -> Side -> [Side]
Enum, Side
Side -> Side -> Bounded Side
forall a. a -> a -> Bounded a
$cminBound :: Side
minBound :: Side
$cmaxBound :: Side
maxBound :: Side
Bounded, (forall x. Side -> Rep Side x)
-> (forall x. Rep Side x -> Side) -> Generic Side
forall x. Rep Side x -> Side
forall x. Side -> Rep Side x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Side -> Rep Side x
from :: forall x. Side -> Rep Side x
$cto :: forall x. Rep Side x -> Side
to :: forall x. Rep Side x -> Side
Generic, HasCallStack => String -> Side
Side -> Bool
Side -> ()
Side -> Side
(HasCallStack => String -> Side)
-> (Side -> Bool) -> (Side -> Side) -> (Side -> ()) -> NFDataX Side
forall a.
(HasCallStack => String -> a)
-> (a -> Bool) -> (a -> a) -> (a -> ()) -> NFDataX a
$cdeepErrorX :: HasCallStack => String -> Side
deepErrorX :: HasCallStack => String -> Side
$chasUndefined :: Side -> Bool
hasUndefined :: Side -> Bool
$censureSpine :: Side -> Side
ensureSpine :: Side -> Side
$crnfX :: Side -> ()
rnfX :: Side -> ()
NFDataX)

data Modifier
    = Shift
    | Ctrl
    | Alt
    | Win
    deriving (Modifier -> Modifier -> Bool
(Modifier -> Modifier -> Bool)
-> (Modifier -> Modifier -> Bool) -> Eq Modifier
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Modifier -> Modifier -> Bool
== :: Modifier -> Modifier -> Bool
$c/= :: Modifier -> Modifier -> Bool
/= :: Modifier -> Modifier -> Bool
Eq, Int -> Modifier -> ShowS
[Modifier] -> ShowS
Modifier -> String
(Int -> Modifier -> ShowS)
-> (Modifier -> String) -> ([Modifier] -> ShowS) -> Show Modifier
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Modifier -> ShowS
showsPrec :: Int -> Modifier -> ShowS
$cshow :: Modifier -> String
show :: Modifier -> String
$cshowList :: [Modifier] -> ShowS
showList :: [Modifier] -> ShowS
Show, Int -> Modifier
Modifier -> Int
Modifier -> [Modifier]
Modifier -> Modifier
Modifier -> Modifier -> [Modifier]
Modifier -> Modifier -> Modifier -> [Modifier]
(Modifier -> Modifier)
-> (Modifier -> Modifier)
-> (Int -> Modifier)
-> (Modifier -> Int)
-> (Modifier -> [Modifier])
-> (Modifier -> Modifier -> [Modifier])
-> (Modifier -> Modifier -> [Modifier])
-> (Modifier -> Modifier -> Modifier -> [Modifier])
-> Enum Modifier
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 :: Modifier -> Modifier
succ :: Modifier -> Modifier
$cpred :: Modifier -> Modifier
pred :: Modifier -> Modifier
$ctoEnum :: Int -> Modifier
toEnum :: Int -> Modifier
$cfromEnum :: Modifier -> Int
fromEnum :: Modifier -> Int
$cenumFrom :: Modifier -> [Modifier]
enumFrom :: Modifier -> [Modifier]
$cenumFromThen :: Modifier -> Modifier -> [Modifier]
enumFromThen :: Modifier -> Modifier -> [Modifier]
$cenumFromTo :: Modifier -> Modifier -> [Modifier]
enumFromTo :: Modifier -> Modifier -> [Modifier]
$cenumFromThenTo :: Modifier -> Modifier -> Modifier -> [Modifier]
enumFromThenTo :: Modifier -> Modifier -> Modifier -> [Modifier]
Enum, Modifier
Modifier -> Modifier -> Bounded Modifier
forall a. a -> a -> Bounded a
$cminBound :: Modifier
minBound :: Modifier
$cmaxBound :: Modifier
maxBound :: Modifier
Bounded, (forall x. Modifier -> Rep Modifier x)
-> (forall x. Rep Modifier x -> Modifier) -> Generic Modifier
forall x. Rep Modifier x -> Modifier
forall x. Modifier -> Rep Modifier x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Modifier -> Rep Modifier x
from :: forall x. Modifier -> Rep Modifier x
$cto :: forall x. Rep Modifier x -> Modifier
to :: forall x. Rep Modifier x -> Modifier
Generic, HasCallStack => String -> Modifier
Modifier -> Bool
Modifier -> ()
Modifier -> Modifier
(HasCallStack => String -> Modifier)
-> (Modifier -> Bool)
-> (Modifier -> Modifier)
-> (Modifier -> ())
-> NFDataX Modifier
forall a.
(HasCallStack => String -> a)
-> (a -> Bool) -> (a -> a) -> (a -> ()) -> NFDataX a
$cdeepErrorX :: HasCallStack => String -> Modifier
deepErrorX :: HasCallStack => String -> Modifier
$chasUndefined :: Modifier -> Bool
hasUndefined :: Modifier -> Bool
$censureSpine :: Modifier -> Modifier
ensureSpine :: Modifier -> Modifier
$crnfX :: Modifier -> ()
rnfX :: Modifier -> ()
NFDataX)

modMap :: KeyCode -> Maybe (Modifier, Side)
modMap :: KeyCode -> Maybe (Modifier, Side)
modMap KeyCode
0x012 = (Modifier, Side) -> Maybe (Modifier, Side)
forall a. a -> Maybe a
Just (Modifier
Shift, Side
OnLeft)
modMap KeyCode
0x059 = (Modifier, Side) -> Maybe (Modifier, Side)
forall a. a -> Maybe a
Just (Modifier
Shift, Side
OnRight)
modMap KeyCode
0x014 = (Modifier, Side) -> Maybe (Modifier, Side)
forall a. a -> Maybe a
Just (Modifier
Ctrl, Side
OnLeft)
modMap KeyCode
0x114 = (Modifier, Side) -> Maybe (Modifier, Side)
forall a. a -> Maybe a
Just (Modifier
Ctrl, Side
OnRight)
modMap KeyCode
0x011 = (Modifier, Side) -> Maybe (Modifier, Side)
forall a. a -> Maybe a
Just (Modifier
Alt, Side
OnLeft)
modMap KeyCode
0x111 = (Modifier, Side) -> Maybe (Modifier, Side)
forall a. a -> Maybe a
Just (Modifier
Alt, Side
OnRight)
modMap KeyCode
0x11f = (Modifier, Side) -> Maybe (Modifier, Side)
forall a. a -> Maybe a
Just (Modifier
Win, Side
OnLeft)
modMap KeyCode
0x127 = (Modifier, Side) -> Maybe (Modifier, Side)
forall a. a -> Maybe a
Just (Modifier
Win, Side
OnRight)
modMap KeyCode
_ = Maybe (Modifier, Side)
forall a. Maybe a
Nothing

{-# INLINE asciiMap #-}
asciiMap :: KeyCode -> Maybe (Unsigned 7)
asciiMap :: KeyCode -> Maybe (Unsigned 7)
asciiMap = (Char -> Unsigned 7) -> Maybe Char -> Maybe (Unsigned 7)
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap Char -> Unsigned 7
forall {c}. Num c => Char -> c
fromChar (Maybe Char -> Maybe (Unsigned 7))
-> (KeyCode -> Maybe Char) -> KeyCode -> Maybe (Unsigned 7)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. KeyCode -> Maybe Char
charMap
  where
    fromChar :: Char -> c
fromChar = Int -> c
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> c) -> (Char -> Int) -> Char -> c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Int
ord

{-# INLINE charMap #-}
charMap :: KeyCode -> Maybe Char
charMap :: KeyCode -> Maybe Char
charMap KeyCode
0x05a = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'\r'
charMap KeyCode
0x15a = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'\r' -- Keypad
charMap KeyCode
0x00d = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'\t'
charMap KeyCode
0x029 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
' '
charMap KeyCode
0x04c = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
';'
charMap KeyCode
0x052 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'\''
charMap KeyCode
0x054 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'['
charMap KeyCode
0x05b = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
']'
charMap KeyCode
0x05d = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'\\'
charMap KeyCode
0x04a = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'/'
charMap KeyCode
0x041 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
','
charMap KeyCode
0x049 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'.'
charMap KeyCode
0x04e = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'-'
charMap KeyCode
0x055 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'='
charMap KeyCode
0x045 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'0'
charMap KeyCode
0x016 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'1'
charMap KeyCode
0x01e = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'2'
charMap KeyCode
0x026 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'3'
charMap KeyCode
0x025 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'4'
charMap KeyCode
0x02e = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'5'
charMap KeyCode
0x036 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'6'
charMap KeyCode
0x03d = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'7'
charMap KeyCode
0x03e = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'8'
charMap KeyCode
0x046 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'9'
charMap KeyCode
0x01c = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'a'
charMap KeyCode
0x032 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'b'
charMap KeyCode
0x021 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'c'
charMap KeyCode
0x023 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'd'
charMap KeyCode
0x024 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'e'
charMap KeyCode
0x02b = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'f'
charMap KeyCode
0x034 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'g'
charMap KeyCode
0x033 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'h'
charMap KeyCode
0x043 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'i'
charMap KeyCode
0x03b = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'j'
charMap KeyCode
0x042 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'k'
charMap KeyCode
0x04b = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'l'
charMap KeyCode
0x03a = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'm'
charMap KeyCode
0x031 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'n'
charMap KeyCode
0x044 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'o'
charMap KeyCode
0x04d = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'p'
charMap KeyCode
0x015 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'q'
charMap KeyCode
0x02d = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'r'
charMap KeyCode
0x01b = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
's'
charMap KeyCode
0x02c = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
't'
charMap KeyCode
0x03c = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'u'
charMap KeyCode
0x02a = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'v'
charMap KeyCode
0x01d = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'w'
charMap KeyCode
0x022 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'x'
charMap KeyCode
0x035 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'y'
charMap KeyCode
0x01a = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'z'
charMap KeyCode
_ = Maybe Char
forall a. Maybe a
Nothing