aboutsummaryrefslogtreecommitdiff
path: root/src/Chelleport/KeySequence.hs
blob: 1d118cd29071ff21145dd51a94e274b90cd9a776 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
module Chelleport.KeySequence where

import Data.List (isPrefixOf, nub)
import qualified Data.Map as Map
import qualified SDL

safeHead :: a -> [a] -> a
safeHead def [] = def
safeHead _ (x : _) = x

nextChars :: [Char] -> [[[Char]]] -> Maybe [Char]
nextChars keys cells =
  case matches of
    [] -> Nothing
    _ -> Just $ nub result
  where
    matches = concatMap (filter (isPrefixOf keys)) cells
    result = concatMap (take 1 . drop (length keys)) matches

isValidKey :: SDL.Keycode -> Bool
isValidKey key = Map.member key keycodeMapping

generateKeyCells :: (Int, Int) -> [Char] -> [[[Char]]]
generateKeyCells (rows, columns) hintKeys =
  (\row -> getCellSeq row <$> [1 .. columns]) <$> [1 .. rows]
  where
    getCellSeq x y = [getPrefix1 x y, getPrefix2 x y, getKey x y]
    getKey _row col = hintKeys !! (col `mod` (columns `div` 2))
    getPrefix1 _row col
      | col <= (columns `div` 2) = 'H'
      | otherwise = 'L'
    getPrefix2 row _col
      | row <= (rows `div` 2) = 'K'
      | otherwise = 'J'

toKeyChar :: SDL.Keycode -> Maybe Char
toKeyChar key = Map.lookup key keycodeMapping

eventToKeycode :: SDL.KeyboardEventData -> SDL.Keycode
eventToKeycode = SDL.keysymKeycode . SDL.keyboardEventKeysym

keycodeMapping :: Map.Map SDL.Keycode Char
keycodeMapping =
  Map.fromList
    [ (SDL.KeycodeA, 'A'),
      (SDL.KeycodeB, 'B'),
      (SDL.KeycodeC, 'C'),
      (SDL.KeycodeD, 'D'),
      (SDL.KeycodeE, 'E'),
      (SDL.KeycodeF, 'F'),
      (SDL.KeycodeG, 'G'),
      (SDL.KeycodeH, 'H'),
      (SDL.KeycodeI, 'I'),
      (SDL.KeycodeJ, 'J'),
      (SDL.KeycodeK, 'K'),
      (SDL.KeycodeL, 'L'),
      (SDL.KeycodeM, 'M'),
      (SDL.KeycodeN, 'N'),
      (SDL.KeycodeO, 'O'),
      (SDL.KeycodeP, 'P'),
      (SDL.KeycodeR, 'R'),
      (SDL.KeycodeS, 'S'),
      (SDL.KeycodeT, 'T'),
      (SDL.KeycodeU, 'U'),
      (SDL.KeycodeV, 'V'),
      (SDL.KeycodeW, 'W'),
      (SDL.KeycodeX, 'X'),
      (SDL.KeycodeY, 'Y'),
      (SDL.KeycodeZ, 'Z'),
      (SDL.Keycode0, '0'),
      (SDL.Keycode1, '1'),
      (SDL.Keycode2, '2'),
      (SDL.Keycode3, '3'),
      (SDL.Keycode4, '4'),
      (SDL.Keycode5, '5'),
      (SDL.Keycode6, '6'),
      (SDL.Keycode7, '7'),
      (SDL.Keycode8, '8'),
      (SDL.Keycode9, '9')
    ]