2020-08-06 01:18:44 +02:00
|
|
|
{-# LANGUAGE RecordWildCards #-}
|
|
|
|
{-# LANGUAGE DeriveAnyClass #-}
|
|
|
|
{-# LANGUAGE DeriveGeneric #-}
|
2020-08-05 22:52:10 +02:00
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
module Keyboard where
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
import Utils
|
2020-08-06 01:18:44 +02:00
|
|
|
import Data.Hashable (Hashable)
|
|
|
|
import GHC.Generics (Generic)
|
|
|
|
|
2020-08-05 22:52:10 +02:00
|
|
|
import qualified Data.List as List
|
2020-08-06 01:18:44 +02:00
|
|
|
import qualified Data.HashMap.Strict as HM
|
2020-08-05 22:52:10 +02:00
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
newtype Keyboard = Keyboard [[Char]]
|
2020-08-06 00:20:18 +02:00
|
|
|
deriving (Eq)
|
2020-08-05 22:52:10 +02:00
|
|
|
|
|
|
|
instance Show Keyboard where
|
|
|
|
show (Keyboard xxs) =
|
|
|
|
xxs |> fmap printRow |> List.intercalate "\n"
|
|
|
|
where
|
|
|
|
printRow :: [Char] -> String
|
|
|
|
printRow xs =
|
|
|
|
xs |> fmap (\x -> '[':x:']':"") |> List.intercalate ""
|
|
|
|
|
2020-08-06 01:18:44 +02:00
|
|
|
data Coord = Coord
|
|
|
|
{ row :: Int
|
|
|
|
, col :: Int
|
|
|
|
} deriving (Eq, Show, Generic)
|
|
|
|
|
|
|
|
instance Hashable Coord
|
|
|
|
|
|
|
|
-- | List of characters to their QWERTY coordinatees.
|
|
|
|
coords :: [(Char, Coord)]
|
|
|
|
coords = [ ('0', Coord { row = 0, col = 0 })
|
|
|
|
, ('1', Coord { row = 0, col = 1 })
|
|
|
|
, ('2', Coord { row = 0, col = 2 })
|
|
|
|
, ('3', Coord { row = 0, col = 3 })
|
|
|
|
, ('4', Coord { row = 0, col = 4 })
|
|
|
|
, ('5', Coord { row = 0, col = 5 })
|
|
|
|
, ('6', Coord { row = 0, col = 6 })
|
|
|
|
, ('7', Coord { row = 0, col = 7 })
|
|
|
|
, ('8', Coord { row = 0, col = 8 })
|
|
|
|
, ('9', Coord { row = 0, col = 9 })
|
|
|
|
-- second row
|
|
|
|
, ('Q', Coord { row = 1, col = 0 })
|
|
|
|
, ('W', Coord { row = 1, col = 1 })
|
|
|
|
, ('E', Coord { row = 1, col = 2 })
|
|
|
|
, ('R', Coord { row = 1, col = 3 })
|
|
|
|
, ('T', Coord { row = 1, col = 4 })
|
|
|
|
, ('Y', Coord { row = 1, col = 5 })
|
|
|
|
, ('U', Coord { row = 1, col = 6 })
|
|
|
|
, ('I', Coord { row = 1, col = 7 })
|
|
|
|
, ('O', Coord { row = 1, col = 8 })
|
|
|
|
, ('P', Coord { row = 1, col = 9 })
|
|
|
|
-- third row
|
|
|
|
, ('A', Coord { row = 2, col = 0 })
|
|
|
|
, ('S', Coord { row = 2, col = 1 })
|
|
|
|
, ('D', Coord { row = 2, col = 2 })
|
|
|
|
, ('F', Coord { row = 2, col = 3 })
|
|
|
|
, ('G', Coord { row = 2, col = 4 })
|
|
|
|
, ('H', Coord { row = 2, col = 5 })
|
|
|
|
, ('J', Coord { row = 2, col = 6 })
|
|
|
|
, ('K', Coord { row = 2, col = 7 })
|
|
|
|
, ('L', Coord { row = 2, col = 8 })
|
|
|
|
, (';', Coord { row = 2, col = 9 })
|
|
|
|
-- fourth row
|
|
|
|
, ('Z', Coord { row = 3, col = 0 })
|
|
|
|
, ('X', Coord { row = 3, col = 1 })
|
|
|
|
, ('C', Coord { row = 3, col = 2 })
|
|
|
|
, ('V', Coord { row = 3, col = 3 })
|
|
|
|
, ('B', Coord { row = 3, col = 4 })
|
|
|
|
, ('N', Coord { row = 3, col = 5 })
|
|
|
|
, ('M', Coord { row = 3, col = 6 })
|
|
|
|
, (',', Coord { row = 3, col = 7 })
|
|
|
|
, ('.', Coord { row = 3, col = 8 })
|
|
|
|
, ('/', Coord { row = 3, col = 9 })
|
|
|
|
]
|
|
|
|
|
|
|
|
-- | Mapping of characters to their coordinates on a QWERTY keyboard with the
|
|
|
|
-- top-left corner as 0,0.
|
|
|
|
charToCoord :: HM.HashMap Char Coord
|
|
|
|
charToCoord = HM.fromList coords
|
|
|
|
|
|
|
|
coordToChar :: Keyboard -> Coord -> Maybe Char
|
|
|
|
coordToChar (Keyboard xxs) Coord{..} =
|
|
|
|
Just $ xxs !! row !! col
|
|
|
|
|
2020-08-05 22:52:10 +02:00
|
|
|
qwerty :: Keyboard
|
|
|
|
qwerty = Keyboard [ ['1','2','3','4','5','6','7','8','9','0']
|
|
|
|
, ['Q','W','E','R','T','Y','U','I','O','P']
|
|
|
|
, ['A','S','D','F','G','H','J','K','L',';']
|
|
|
|
, ['Z','X','C','V','B','N','M',',','.','/']
|
|
|
|
]
|