module Axiom::Optimizer::Function::Predicate::Comparable::NeverComparable

Optimize when the operands will never be comparable

Public Instance Methods

optimizable?() click to toggle source

Test if the operands will never be comparable

@return [Boolean]

@api private

# File lib/axiom/optimizer/function/predicate/comparable.rb, line 101
def optimizable?
  util = Util
  if    util.constant?(left)  then left_invalid_constant?
  elsif util.constant?(right) then right_invalid_constant?
  else
    !comparable?
  end
end

Private Instance Methods

comparable?() click to toggle source

Test if the left and right operand are comparable

@return [Boolean]

@api private

# File lib/axiom/optimizer/function/predicate/comparable.rb, line 137
def comparable?
  left.class <=> right.class
end
left_invalid_constant?() click to toggle source

Test if the left operand is an invalid constant

@return [Boolean]

@api private

# File lib/axiom/optimizer/function/predicate/comparable.rb, line 117
def left_invalid_constant?
  type = right.type
  !type.infer(left.class).equal?(type)
end
right_invalid_constant?() click to toggle source

Test if the right operand is an invalid constant

@return [Boolean]

@api private

# File lib/axiom/optimizer/function/predicate/comparable.rb, line 127
def right_invalid_constant?
  type = left.type
  !type.infer(right.class).equal?(type)
end