about summary refs log tree commit diff
path: root/scratch/brilliant/Keyboard.hs
diff options
context:
space:
mode:
authorWilliam Carroll <wpcarro@gmail.com>2020-08-05T23·18+0100
committerWilliam Carroll <wpcarro@gmail.com>2020-08-05T23·18+0100
commit5f52077492160195681a0a9bca806fd78ddbd6fd (patch)
tree2ab12112b52bda8ecc314954fbdb200443e97454 /scratch/brilliant/Keyboard.hs
parente14fff7d4b04c37155acf046b7b3f350cf6ad3b6 (diff)
Re-type type using the altered keyboard
Remember: always read the instructions; that's the most important part.
Diffstat (limited to 'scratch/brilliant/Keyboard.hs')
-rw-r--r--scratch/brilliant/Keyboard.hs70
1 files changed, 70 insertions, 0 deletions
diff --git a/scratch/brilliant/Keyboard.hs b/scratch/brilliant/Keyboard.hs
index 885acb29e4cd..ec3207079694 100644
--- a/scratch/brilliant/Keyboard.hs
+++ b/scratch/brilliant/Keyboard.hs
@@ -1,8 +1,15 @@
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE DeriveGeneric #-}
 --------------------------------------------------------------------------------
 module Keyboard where
 --------------------------------------------------------------------------------
 import Utils
+import Data.Hashable (Hashable)
+import GHC.Generics (Generic)
+
 import qualified Data.List as List
+import qualified Data.HashMap.Strict as HM
 --------------------------------------------------------------------------------
 
 newtype Keyboard = Keyboard [[Char]]
@@ -16,6 +23,69 @@ instance Show Keyboard where
       printRow xs =
         xs |> fmap (\x -> '[':x:']':"") |> List.intercalate ""
 
+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
+
 qwerty :: Keyboard
 qwerty = Keyboard [ ['1','2','3','4','5','6','7','8','9','0']
                   , ['Q','W','E','R','T','Y','U','I','O','P']