class Keisan::Functions::Registry

Public Class Methods

new(functions: {}, parent: nil, use_defaults: true, force: false) click to toggle source
# File lib/keisan/functions/registry.rb, line 4
def initialize(functions: {}, parent: nil, use_defaults: true, force: false)
  @hash = {}
  @parent = parent
  @use_defaults = use_defaults

  functions.each do |name, function|
    register!(name, function, force: force)
  end
end

Public Instance Methods

[](name) click to toggle source
# File lib/keisan/functions/registry.rb, line 14
def [](name)
  return @hash[name] if @hash.has_key?(name)

  if @parent && (parent_value = @parent[name])
    return parent_value
  end

  return default_registry[name] if @use_defaults && default_registry.has_name?(name)
  raise Exceptions::UndefinedFunctionError.new name
end
has?(name) click to toggle source
# File lib/keisan/functions/registry.rb, line 29
def has?(name)
  !!self[name]
rescue Exceptions::UndefinedFunctionError
  false
end
locals() click to toggle source
# File lib/keisan/functions/registry.rb, line 25
def locals
  @hash
end
modifiable?(name) click to toggle source
# File lib/keisan/functions/registry.rb, line 35
def modifiable?(name)
  !frozen? && has?(name)
end
register!(name, function, force: false) click to toggle source
# File lib/keisan/functions/registry.rb, line 39
def register!(name, function, force: false)
  raise Exceptions::UnmodifiableError.new("Cannot modify frozen functions registry") if frozen?
  name = name.to_s

  case function
  when Proc
    self[name] = ProcFunction.new(name, function)
  when Function
    self[name] = function
  else
    raise Exceptions::InvalidFunctionError.new
  end
end

Protected Instance Methods

has_name?(name) click to toggle source

For checking if locally defined

# File lib/keisan/functions/registry.rb, line 56
def has_name?(name)
  @hash.has_key?(name)
end

Private Instance Methods

[]=(name, function) click to toggle source
# File lib/keisan/functions/registry.rb, line 62
def []=(name, function)
  @hash[name] = function
end
default_registry() click to toggle source
# File lib/keisan/functions/registry.rb, line 66
def default_registry
  DefaultRegistry.registry
end