module Dry::Logic

def self.Predicate(block)

def self.Predicate(block)
  case block
  when Method then Predicate.new(block.name, &block)
  else raise ArgumentError, 'predicate needs an :id'
  end
end

def self.Result(input, value, rule)

def self.Result(input, value, rule)
  case value
  when Result
    value.class.new(value.input, value.success?, rule)
  when Array
    Result::Set.new(input, value, rule)
  else
    Result::Value.new(input, value, rule)
  end
end