Class: Tina4::Frond::LoopContext

Inherits:
Object
  • Object
show all
Defined in:
lib/tina4/frond.rb

Overview

-- Lazy context overlay for for-loops (avoids full Hash#dup) --

Instance Method Summary collapse

Constructor Details

#initialize(parent) ⇒ LoopContext

Returns a new instance of LoopContext.



152
153
154
155
# File 'lib/tina4/frond.rb', line 152

def initialize(parent)
  @parent = parent
  @local = {}
end

Instance Method Details

#[](key) ⇒ Object



157
158
159
# File 'lib/tina4/frond.rb', line 157

def [](key)
  @local.key?(key) ? @local[key] : @parent[key]
end

#[]=(key, value) ⇒ Object



161
162
163
# File 'lib/tina4/frond.rb', line 161

def []=(key, value)
  @local[key] = value
end

#dupObject



196
197
198
199
200
# File 'lib/tina4/frond.rb', line 196

def dup
  copy = LoopContext.new(@parent)
  @local.each { |k, v| copy[k] = v }
  copy
end

#each(&block) ⇒ Object



208
209
210
# File 'lib/tina4/frond.rb', line 208

def each(&block)
  to_h.each(&block)
end

#fetch(key, *args, &block) ⇒ Object



171
172
173
174
175
176
177
178
179
180
181
182
183
# File 'lib/tina4/frond.rb', line 171

def fetch(key, *args, &block)
  if @local.key?(key)
    @local[key]
  elsif @parent.key?(key)
    @parent[key]
  elsif block
    yield key
  elsif !args.empty?
    args[0]
  else
    raise KeyError, "key not found: #{key.inspect}"
  end
end

#is_a?(klass) ⇒ Boolean

Returns:

  • (Boolean)


216
217
218
# File 'lib/tina4/frond.rb', line 216

def is_a?(klass)
  klass == Hash || super
end

#key?(key) ⇒ Boolean Also known as: include?, has_key?

Returns:

  • (Boolean)


165
166
167
# File 'lib/tina4/frond.rb', line 165

def key?(key)
  @local.key?(key) || @parent.key?(key)
end

#keysObject



220
221
222
# File 'lib/tina4/frond.rb', line 220

def keys
  (@parent.is_a?(LoopContext) ? @parent.keys : @parent.keys) | @local.keys
end

#merge(other) ⇒ Object



185
186
187
188
189
# File 'lib/tina4/frond.rb', line 185

def merge(other)
  dup_hash = to_h
  dup_hash.merge!(other)
  dup_hash
end

#merge!(other) ⇒ Object



191
192
193
194
# File 'lib/tina4/frond.rb', line 191

def merge!(other)
  other.each { |k, v| @local[k] = v }
  self
end

#respond_to_missing?(name, include_private = false) ⇒ Boolean

Returns:

  • (Boolean)


212
213
214
# File 'lib/tina4/frond.rb', line 212

def respond_to_missing?(name, include_private = false)
  @parent.respond_to?(name, include_private) || super
end

#to_hObject



202
203
204
205
206
# File 'lib/tina4/frond.rb', line 202

def to_h
  h = @parent.is_a?(LoopContext) ? @parent.to_h : @parent.dup
  @local.each { |k, v| h[k] = v }
  h
end