class Item
  module Search
    module Fields
      class SetField < Field
        def initialize(*args)
          super(*args)
          @values = {true => Set.new, false => Set.new}
        end
        
        def <<(filter)
          if @values[!filter.positive?].include?(filter.value)
            raise Item::Search::Contradiction,
                  "positive #{key} and negative #{key} both contain #{filter.value}"
          end
          
          @values[filter.positive?] << filter.value
        end
        
        def to_flex_params
          {
            :"_#{key}s" => nil_if_empty(@values[true]),
            :"_negative_#{key}s" => nil_if_empty(@values[false])
          }
        end
        
        private
        
        def nil_if_empty(set)
          set.map { |value| {key => value} } unless set.empty?
        end
      end
    end
  end
end