Class: Furud::Functions::Registry

Inherits:
Object
  • Object
show all
Includes:
Enumerable, Enumerable[Entry]
Defined in:
lib/furud/functions.rb,
sig/furud.rbs

Instance Method Summary collapse

Constructor Details

#initialize ⇒ Registry

Returns a new instance of Registry.



57
58
59
# File 'lib/furud/functions.rb', line 57

def initialize
  @entries = {}
end

Instance Method Details

#[](name) ⇒ Entry?

Parameters:

  • name (String)

Returns:



78
# File 'lib/furud/functions.rb', line 78

def [](name) = @entries[name.to_s.upcase]

#call(name, *args) ⇒ Object

Parameters:

  • name (String)
  • args (Object)

Returns:

  • (Object)


83
84
85
86
87
88
# File 'lib/furud/functions.rb', line 83

def call(name, *args)
  entry = self[name]
  return ErrorValue.new(code: :name) unless entry

  entry.call(*args)
end

#each {|arg0| ... } ⇒ self

Yields:

Yield Parameters:

Yield Returns:

  • (void)

Returns:

  • (self)


80
# File 'lib/furud/functions.rb', line 80

def each(&block) = @entries.values.each(&block)

#initialize_copy(other) ⇒ Object



61
62
63
64
# File 'lib/furud/functions.rb', line 61

def initialize_copy(other)
  super
  @entries = other.instance_variable_get(:@entries).dup
end

#names ⇒ Array[String]

Returns:

  • (Array[String])


79
# File 'lib/furud/functions.rb', line 79

def names = @entries.keys.sort.freeze

#register(name, arity:, volatile: false) {|arg0| ... } ⇒ self

Parameters:

  • name (String)
  • arity: (Integer, Range[Integer], Array[Integer])
  • volatile: (Boolean) (defaults to: false)

Yields:

Yield Parameters:

  • arg0 (Object)

Yield Returns:

  • (Object)

Returns:

  • (self)

Raises:

  • (ArgumentError)


66
67
68
69
70
71
72
73
74
75
76
# File 'lib/furud/functions.rb', line 66

def register(name, arity:, volatile: false, &implementation)
  raise ArgumentError, "implementation block is required" unless implementation

  name = name.to_s.upcase
  raise ArgumentError, "invalid function name: #{name}" unless name.match?(/\A[A-Z][A-Z0-9_.]*\z/)
  raise ArgumentError, "function already registered: #{name}" if @entries.key?(name)

  @entries[name] = Entry.new(name: name, arity: arity, volatile: !!volatile,
                             implementation: implementation)
  self
end

#size ⇒ Integer

Returns:

  • (Integer)


81
# File 'lib/furud/functions.rb', line 81

def size = @entries.size