class Dry::Logic::Operations::Key

def self.evaluator(name)

def self.evaluator(name)
  Evaluator::Key.new(name)
end

def self.new(rules, options)

def self.new(rules, options)
  if options[:evaluator]
    super
  else
    name = options.fetch(:name)
    eval = options.fetch(:evaluator, evaluator(name))
    super(rules, options.merge(evaluator: eval, path: name))
  end
end

def [](hash)

def [](hash)
  rule[evaluator[hash]]
end

def ast(input = nil)

def ast(input = nil)
  if input
    [type, [path, rule.ast(evaluator[input])]]
  else
    [type, [path, rule.ast]]
  end
end

def call(hash)

def call(hash)
  input = evaluator[hash]
  result = rule.(input)
  if result.success?
    Result::SUCCESS
  else
    Result.new(false, path) { [type, [path, result.to_ast]] }
  end
end

def initialize(*rules, **options)

def initialize(*rules, **options)
  super
  @evaluator = options[:evaluator]
  @path = options[:path]
end

def to_s

def to_s
  "#{type}[#{path}](#{rule})"
end

def type

def type
  :key
end