# frozen_string_literal: true

module Farseer
  class Or
    include MapFactory

    def initialize(*parsers)
      @parsers = parsers.flatten
      freeze
    end

    def parse(input)
      case @parsers.length
      when 0 then Maybe.none
      when 1 then @parsers.first.parse(input)
      else parse_helper(input)
      end
    end

    def parse_helper(input)
      @parsers.reduce do |acc, parser|
        acc.parse(input).bind_none { parser.parse(input) }
      end
    end
  end
end