class RuboCop::AST::NodePattern::Compiler::Binding

def union_bind(enum)

rubocop:disable Metrics/MethodLength, Metrics/AbcSize
def union_bind(enum)
  # We need to reset @bound before each branch is processed.
  # Moreover we need to keep track of newly encountered wildcards.
  # Var `newly_bound_intersection` will hold those that are encountered
  # in all branches; these are not a problem.
  # Var `partially_bound` will hold those encountered in only a subset
  # of the branches; these can't be used outside of the union.
  return to_enum __method__, enum unless block_given?
  newly_bound_intersection = nil
  partially_bound = []
  bound_before = @bound.dup
  result = enum.each do |e|
    @bound = bound_before.dup if newly_bound_intersection
    yield e
    newly_bound = @bound.keys - bound_before.keys
    if newly_bound_intersection.nil?
      # First iteration
      newly_bound_intersection = newly_bound
    else
      union = newly_bound_intersection | newly_bound
      newly_bound_intersection &= newly_bound
      partially_bound |= union - newly_bound_intersection
    end
  end
  # At this point, all members of `newly_bound_intersection` can be used
  # for unification outside of the union, but partially_bound may not
  forbid(partially_bound)
  result
end