class RBS::VarianceCalculator::Result

def compatible?(var, with_annotation:)

def compatible?(var, with_annotation:)
  variance = result[var]
  case
  when variance == :unused
    true
  when with_annotation == :invariant
    true
  when variance == with_annotation
    true
  else
    false
  end
end

def contravariant(x)

def contravariant(x)
  case result[x]
  when :unused
    result[x] = :contravariant
  when :covariant
    result[x] = :invariant
  end
end

def covariant(x)

def covariant(x)
  case result[x]
  when :unused
    result[x] = :covariant
  when :contravariant
    result[x] = :invariant
  end
end

def each(&block)

def each(&block)
  result.each(&block)
end

def include?(name)

def include?(name)
  result.key?(name)
end

def incompatible?(params)

def incompatible?(params)
  # @type set: Hash[Symbol]
  set = Set[]
  params.each do |param|
    unless compatible?(param.name, with_annotation: param.variance)
      set << param.name
    end
  end
  unless set.empty?
    set
  end
end

def initialize(variables:)

def initialize(variables:)
  @result = {}
  variables.each do |x|
    result[x] = :unused
  end
end

def invariant(x)

def invariant(x)
  result[x] = :invariant
end