Class: Keisan::Functions::Registry

Inherits:
Object
  • Object
show all
Defined in:
lib/keisan/functions/registry.rb

Instance Method Summary collapse

Constructor Details

#initialize(functions: {}, parent: nil, use_defaults: true, force: false) ⇒ Registry

Returns a new instance of Registry.



4
5
6
7
8
9
10
11
12
# 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

Instance Method Details

#[](name) ⇒ Object



14
15
16
17
18
19
20
21
22
23
# 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) ⇒ Boolean

Returns:

  • (Boolean)


29
30
31
32
33
# File 'lib/keisan/functions/registry.rb', line 29

def has?(name)
  !!self[name]
rescue Exceptions::UndefinedFunctionError
  false
end

#localsObject



25
26
27
# File 'lib/keisan/functions/registry.rb', line 25

def locals
  @hash
end

#modifiable?(name) ⇒ Boolean

Returns:

  • (Boolean)


35
36
37
# File 'lib/keisan/functions/registry.rb', line 35

def modifiable?(name)
  !frozen? && has?(name)
end

#register!(name, function, force: false) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
# 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