/
keymap.cr
39 lines (36 loc) · 835 Bytes
/
keymap.cr
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
module Typhar
module Types
class Keymap
YAML.mapping(
data: {
type: Hash(String, KeymapEntry)
}
)
def [](key)
data[key]?.not_nil!
end
def []?(key)
data.fetch(key.to_s) do |key|
result = data.find { |k, v| v.shift == key }
if result
result[1]
else
nil
end
end
end
def dereference!
data.map do |key, value|
value.neighbors = value.neighbors.flat_map do |neighbor|
if data[neighbor]?
neighbor_entry = data[neighbor]
[neighbor, neighbor_entry.shift]
else
raise UnknownKeyError.new("Unknown key '#{neighbor}' in keymap")
end
end
end
end
end
end
end