class Dentaku::AST::FunctionRegistry

Public Class Methods

arity() click to toggle source
# File lib/dentaku/ast/function_registry.rb, line 45
def self.arity
  @implementation.arity < 0 ? nil : @implementation.arity
end
callback() click to toggle source
# File lib/dentaku/ast/function_registry.rb, line 41
def self.callback
  @callback
end
callback=(callback) click to toggle source
# File lib/dentaku/ast/function_registry.rb, line 37
def self.callback=(callback)
  @callback = callback
end
default() click to toggle source
# File lib/dentaku/ast/function_registry.rb, line 85
def self.default
  Dentaku::AST::Function.registry
end
implementation() click to toggle source
# File lib/dentaku/ast/function_registry.rb, line 25
def self.implementation
  @implementation
end
implementation=(impl) click to toggle source
# File lib/dentaku/ast/function_registry.rb, line 21
def self.implementation=(impl)
  @implementation = impl
end
max_param_count() click to toggle source
# File lib/dentaku/ast/function_registry.rb, line 53
def self.max_param_count
  @implementation.parameters.select { |type, _name| type == :rest }.any? ? Float::INFINITY : @implementation.parameters.count
end
min_param_count() click to toggle source
# File lib/dentaku/ast/function_registry.rb, line 49
def self.min_param_count
  @implementation.parameters.select { |type, _name| type == :req }.count
end
name() click to toggle source
# File lib/dentaku/ast/function_registry.rb, line 17
def self.name
  @name
end
name=(name) click to toggle source
# File lib/dentaku/ast/function_registry.rb, line 13
def self.name=(name)
  @name = name
end
type() click to toggle source
# File lib/dentaku/ast/function_registry.rb, line 33
def self.type
  @type
end
type=(type) click to toggle source
# File lib/dentaku/ast/function_registry.rb, line 29
def self.type=(type)
  @type = type
end

Public Instance Methods

default() click to toggle source
# File lib/dentaku/ast/function_registry.rb, line 81
def default
  self.class.default
end
get(name) click to toggle source
# File lib/dentaku/ast/function_registry.rb, line 4
def get(name)
  name = function_name(name)
  return self[name] if has_key?(name)
  return default[name] if default.has_key?(name)
  nil
end
register(name, type, implementation, callback = nil) click to toggle source
# File lib/dentaku/ast/function_registry.rb, line 11
def register(name, type, implementation, callback = nil)
  function = Class.new(Function) do
    def self.name=(name)
      @name = name
    end

    def self.name
      @name
    end

    def self.implementation=(impl)
      @implementation = impl
    end

    def self.implementation
      @implementation
    end

    def self.type=(type)
      @type = type
    end

    def self.type
      @type
    end

    def self.callback=(callback)
      @callback = callback
    end

    def self.callback
      @callback
    end

    def self.arity
      @implementation.arity < 0 ? nil : @implementation.arity
    end

    def self.min_param_count
      @implementation.parameters.select { |type, _name| type == :req }.count
    end

    def self.max_param_count
      @implementation.parameters.select { |type, _name| type == :rest }.any? ? Float::INFINITY : @implementation.parameters.count
    end

    def value(context = {})
      args = @args.map { |a| a.value(context) }
      self.class.implementation.call(*args)
    end

    def type
      self.class.type
    end
  end

  define_class(name, function)

  function.name = name
  function.type = type
  function.implementation = implementation
  function.callback = callback

  self[function_name(name)] = function
end
register_class(name, function_class) click to toggle source
# File lib/dentaku/ast/function_registry.rb, line 77
def register_class(name, function_class)
  self[function_name(name)] = function_class
end
type() click to toggle source
# File lib/dentaku/ast/function_registry.rb, line 62
def type
  self.class.type
end
value(context = {}) click to toggle source
# File lib/dentaku/ast/function_registry.rb, line 57
def value(context = {})
  args = @args.map { |a| a.value(context) }
  self.class.implementation.call(*args)
end

Private Instance Methods

define_class(function_name, function) click to toggle source
# File lib/dentaku/ast/function_registry.rb, line 99
def define_class(function_name, function)
  class_name = normalize_name(function_name)
  return if Dentaku::AST::Function.const_defined?(class_name)

  Dentaku::AST::Function.const_set(class_name, function)
end
function_name(name) click to toggle source
# File lib/dentaku/ast/function_registry.rb, line 91
def function_name(name)
  name.to_s.downcase
end
normalize_name(function_name) click to toggle source
# File lib/dentaku/ast/function_registry.rb, line 95
def normalize_name(function_name)
  function_name.to_s.capitalize.gsub(/\W/, '_')
end