diff options
author | William Carroll <wpcarro@gmail.com> | 2020-08-05T23·18+0100 |
---|---|---|
committer | William Carroll <wpcarro@gmail.com> | 2020-08-05T23·18+0100 |
commit | 5f52077492160195681a0a9bca806fd78ddbd6fd (patch) | |
tree | 2ab12112b52bda8ecc314954fbdb200443e97454 /scratch/brilliant/Keyboard.hs | |
parent | e14fff7d4b04c37155acf046b7b3f350cf6ad3b6 (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.hs | 70 |
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'] |