class Keisan::AST::Hash

Public Class Methods

new(key_value_pairs) click to toggle source
# File lib/keisan/ast/hash.rb, line 6
def initialize(key_value_pairs)
  @hash = ::Hash[key_value_pairs.map(&:to_a).map {|k,v| [k.value, v.to_node]}]
end

Public Instance Methods

[](key) click to toggle source
# File lib/keisan/ast/hash.rb, line 15
def [](key)
  key = key.to_node
  return nil unless key.is_a?(AST::ConstantLiteral)

  @hash[key.value] || Cell.new(Null.new).tap do |cell|
    @hash[key.value] = cell
  end
end
each(&block) click to toggle source
# File lib/keisan/ast/hash.rb, line 57
def each(&block)
  @hash.each(&block)
end
evaluate(context = nil) click to toggle source
# File lib/keisan/ast/hash.rb, line 36
def evaluate(context = nil)
  return self if frozen?
  context ||= Context.new

  @hash = ::Hash[
    @hash.map do |key, val|
      if val.is_a?(Cell)
        [key, val]
      else
        [key, val.evaluate(context)]
      end
    end
  ]

  self
end
freeze() click to toggle source
Calls superclass method
# File lib/keisan/ast/hash.rb, line 10
def freeze
  values.each(&:freeze)
  super
end
is_constant?() click to toggle source
# File lib/keisan/ast/hash.rb, line 94
def is_constant?
  @hash.all? {|k,v| v.is_constant?}
end
keys() click to toggle source
# File lib/keisan/ast/hash.rb, line 61
def keys
  @hash.keys
end
simplify(context = nil) click to toggle source
# File lib/keisan/ast/hash.rb, line 53
def simplify(context = nil)
  evaluate(context)
end
to_cell() click to toggle source
# File lib/keisan/ast/hash.rb, line 84
def to_cell
  h = self.class.new([])
  h.instance_variable_set(:@hash, ::Hash[
    @hash.map do |key, value|
      [key, value.to_cell]
    end
  ])
  AST::Cell.new(h)
end
to_s() click to toggle source
# File lib/keisan/ast/hash.rb, line 80
def to_s
  "{#{@hash.map {|k,v| "#{k.is_a?(::String) ? "'#{k}'" : k}: #{v}"}.join(', ')}}"
end
traverse(&block) click to toggle source
Calls superclass method
# File lib/keisan/ast/hash.rb, line 24
def traverse(&block)
  value = super(&block)
  return value if value
  @hash.each do |k, v|
    value = k.to_node.traverse(&block)
    return value if value
    value = v.traverse(&block)
    return value if value
  end
  false
end
value(context = nil) click to toggle source
# File lib/keisan/ast/hash.rb, line 69
def value(context = nil)
  context ||= Context.new
  evaluate(context)

  ::Hash[
    @hash.map {|key, val|
      [key, val.value(context)]
    }
  ]
end
values() click to toggle source
# File lib/keisan/ast/hash.rb, line 65
def values
  @hash.values
end