Code Snippet
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
| -- HELPERS
isHex : String -> String
isHex str =
case String.startsWith "0x" str of
True ->
hexToString (String.dropLeft 2 str)
False ->
toSingleByte str
hexToString : String -> String
hexToString hex =
-- Take chunks of 2 hex digits and apply formula: (a * 16^1) + (b * 16^0)
-- Example (d_16 = 13_10): 0xd3 => (d * 16^1) + (3 * 16^0) = 208 + 3 = 211
let
zero =
hex |> String.all (\c -> c == '0')
asciiToNumber x =
let
y =
x |> Char.toCode
in
case y > 96 of
-- ASCII codes for [a-f] => [97-102]
True ->
y - 97 + 10
-- ASCII codes for [0-9] => [48-57]
False ->
y - 48
rec xs acc =
case xs == "" of
False ->
let
( y, ys ) =
case String.uncons xs of
Nothing ->
( Nothing, "" )
Just ( a, rest ) ->
( Just a, rest )
( z, zs ) =
case String.uncons ys of
Nothing ->
( Nothing, "" )
Just ( b, rest ) ->
( Just b, rest )
keyCode =
case ( y, z ) of
( Just a, Just b ) ->
((asciiToNumber a) * 16)
+ (asciiToNumber b)
( Just a, _ ) ->
(asciiToNumber a) * 16
( _, _ ) ->
0
in
rec zs (acc ++ (keyCode |> stringify))
True ->
acc
in
case zero of
True ->
""
False ->
rec (hex |> String.toLower) ""
|
References: