Class: VER::Keymap
- Inherits:
-
Struct
- Object
- Struct
- VER::Keymap
show all
- Includes:
- Results
- Defined in:
- lib/ver/keymap.rb
Defined Under Namespace
Modules: Results
Classes: MapHash
Constant Summary
collapse
- MERGER =
proc{|key, v1, v2|
if v1.respond_to?(:merge) && v2.respond_to?(:merge)
v1.merge(v2, &MERGER)
else
v2
end
}
Instance Attribute Summary collapse
Instance Method Summary
collapse
Constructor Details
#initialize(keymap = MapHash.new, keys = Set.new) ⇒ Keymap
Returns a new instance of Keymap.
69
70
71
72
|
# File 'lib/ver/keymap.rb', line 69
def initialize(keymap = MapHash.new, keys = Set.new)
self.keymap = keymap
self.keys = keys
end
|
Instance Attribute Details
#keymap ⇒ Object
Returns the value of attribute keymap
4
5
6
|
# File 'lib/ver/keymap.rb', line 4
def keymap
@keymap
end
|
#keys ⇒ Object
Returns the value of attribute keys
4
5
6
|
# File 'lib/ver/keymap.rb', line 4
def keys
@keys
end
|
Instance Method Details
#[](*sequence) ⇒ Object
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
# File 'lib/ver/keymap.rb', line 96
def [](*sequence)
sequence = [*sequence].flatten
remaining = sequence.dup
current = keymap
while key = remaining.shift
previous = current
if current.key?(key)
current = current[key]
break unless current.respond_to?(:key?)
else
current.find do |ckey, cvalue|
next unless ckey.is_a?(Symbol)
case resolved = MinorMode[ckey].resolve([key, *remaining])
when Incomplete
return resolved
when Impossible
false
else
return cvalue.combine(resolved.last)
end
end
return Impossible.new(sequence)
end
end
case current
when MapHash Incomplete.new(sequence, current)
else
current
end
end
|
#[]=(*sequence, action) ⇒ Object
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
# File 'lib/ver/keymap.rb', line 74
def []=(*sequence, action)
sequence = [*sequence].flatten
top = sub = MapHash.new
while key = sequence.shift
if key.respond_to?(:to_str)
canonical = key_to_canonical(key.to_str)
self.keys << canonical
else
canonical = key
end
if sequence.empty?
sub[canonical] = action
else
sub = sub[canonical] = MapHash.new
end
end
keymap.replace(keymap.merge(top, &MERGER))
end
|
#actions ⇒ Object
144
145
146
|
# File 'lib/ver/keymap.rb', line 144
def actions
keymap.deep_each.map{|key, value| value }
end
|
#key_to_canonical(key) ⇒ Object
148
149
150
151
152
153
154
155
156
157
|
# File 'lib/ver/keymap.rb', line 148
def key_to_canonical(key)
case key
when /^[a-zA-Z0-9]$/
key
when /^</
key
else
"<#{key}>"
end
end
|
#merge(keymap) ⇒ Object
133
134
135
136
|
# File 'lib/ver/keymap.rb', line 133
def merge(keymap)
merged = keymap.keymap.merge(self.keymap, &MERGER)
self.class.new(merged, keys + keymap.keys)
end
|
#merge!(keymap) ⇒ Object
138
139
140
141
142
|
# File 'lib/ver/keymap.rb', line 138
def merge!(keymap)
self.keymap = keymap.keymap.merge(self.keymap, &MERGER)
self.keys += keymap.keys
keymap
end
|