class Dry::Logic::Result

def ast(input = Undefined)

def ast(input = Undefined)
  serializer.(input)
end

def failure?

def failure?
  !success?
end

def initialize(success, id = nil, &block)

def initialize(success, id = nil, &block)
  @success = success
  @id = id
  @serializer = block
end

def success?

def success?
  success
end

def to_ast

def to_ast
  if id
    [type, [id, ast]]
  else
    ast
  end
end

def to_s

def to_s
  visit(to_ast)
end

def type

def type
  success? ? :success : :failure
end

def visit(ast)

def visit(ast)
  __send__(:"visit_#{ast[0]}", ast[1])
end

def visit_and(node)

def visit_and(node)
  left, right = node
  "#{visit(left)} AND #{visit(right)}"
end

def visit_hint(node)

def visit_hint(node)
  visit(node)
end

def visit_not(node)

def visit_not(node)
  "not(#{visit(node)})"
end

def visit_or(node)

def visit_or(node)
  left, right = node
  "#{visit(left)} OR #{visit(right)}"
end

def visit_predicate(node)

def visit_predicate(node)
  name, args = node
  if args.empty?
    name.to_s
  else
    "#{name}(#{args.map(&:last).map(&:inspect).join(", ")})"
  end
end

def visit_xor(node)

def visit_xor(node)
  left, right = node
  "#{visit(left)} XOR #{visit(right)}"
end