module AQL
  class Node
    class Operator
      # Base class for binary operators
      class Binary < self
        include Composition.new(:left, :right)

      private

        # Emit node
        #
        # @return [undefined]
        #
        # @api private
        #
        def emit(buffer)
          buffer.binary(left, operator, right)
        end

        # Binary equality operator
        class Equality < self
          SYMBOL = :==
        end

        # Binary inequality operator
        class Inequality < self
          SYMBOL = :'!='
        end

        # Binary or operator
        class Or < self
          SYMBOL = :'||'
        end

        # Binary and operator
        class And < self
          SYMBOL = :'&&'
        end

        # Binary in operator
        class In < self
          SYMBOL = :'IN'
        end

        # Binary less than operator
        class LessThan < self
          SYMBOL = :'<'
        end

        # Binary less than or equal to operator
        class LessThanOrEqualTo < self
          SYMBOL = :'<='
        end

        # Binary greater than operator
        class GreaterThan < self
          SYMBOL = :'>'
        end

        # Binary greater than or equal to operator
        class GreaterThanOrEqualTo < self
          SYMBOL = :'>='
        end

        # Binary addition operator
        class Addition < self
          SYMBOL = :+
        end

        # Binary substraction operator
        class Subtraction < self
          SYMBOL = :-
        end

        # Binary multiplication operator
        class Multiplication < self
          SYMBOL = :*
        end

        # Binary division operator
        class Division < self
          SYMBOL = :/
        end

        # Binary modulo operator
        class Modulo < self
          SYMBOL = :%
        end
      end
    end
  end
end

module AQL
  class Node
    class Operator
      # Base class for binary operators
      class Binary < self
        include Composition.new(:left, :right)

      private

        # Emit node
        #
        # @return [undefined]
        #
        # @api private
        #
        def emit(buffer)
          buffer.binary(left, operator, right)
        end

        # Binary assignment operator
        class Assignment < self
          SYMBOL = :'='
        end

        # Binary equality operator
        class Equality < self
          SYMBOL = :==
        end

        # Binary inequality operator
        class Inequality < self
          SYMBOL = :'!='
        end

        # Binary or operator
        class Or < self
          SYMBOL = :'||'
        end

        # Binary and operator
        class And < self
          SYMBOL = :'&&'
        end

        # Binary in operator
        class In < self
          SYMBOL = :'IN'
        end

        # Binary less than operator
        class LessThan < self
          SYMBOL = :'<'
        end

        # Binary less than or equal to operator
        class LessThanOrEqualTo < self
          SYMBOL = :'<='
        end

        # Binary greater than operator
        class GreaterThan < self
          SYMBOL = :'>'
        end

        # Binary greater than or equal to operator
        class GreaterThanOrEqualTo < self
          SYMBOL = :'>='
        end

        # Binary addition operator
        class Addition < self
          SYMBOL = :+
        end

        # Binary substraction operator
        class Subtraction < self
          SYMBOL = :-
        end

        # Binary multiplication operator
        class Multiplication < self
          SYMBOL = :*
        end

        # Binary division operator
        class Division < self
          SYMBOL = :/
        end

        # Binary modulo operator
        class Modulo < self
          SYMBOL = :%
        end
      end
    end
  end
end

Add support for assignment operator
Add support for assignment operator
