class Steep::TypeAssignability

def compact0(types)

def compact0(types)
  if types.size == 1
    types
  else
    type, *types_ = types
    compacted = compact0(types_)
    compacted.flat_map do |type_|
      case
      when type == type_
        [type]
      when test(src: type_, dest: type)
        [type]
      when test(src: type, dest: type_)
        [type_]
      else
        [type, type_]
      end
    end.uniq
  end
end