module TDiff::Unordered

def self.included(base)


Includes {TDiff}.
def self.included(base)
  base.send :include, TDiff
end

def tdiff_recursive_unordered(tree,&block)

Other tags:
    Since: - 0.3.2

Other tags:
    Yieldparam: node -
    Yieldparam: change -

Other tags:
    Yield: -

Parameters:
  • tree (#tdiff_each_child) --
def tdiff_recursive_unordered(tree,&block)
  x = enum_for(:tdiff_each_child,self)
  y = enum_for(:tdiff_each_child,tree)
  unchanged = {}
  changes = []
  x.each_with_index do |xi,i|
    y.each_with_index do |yj,j|
      if (!unchanged.has_value?(yj) && xi.tdiff_equal(yj))
        unchanged[xi] = yj
        changes << [i, ' ', xi]
        break
      end
    end
    unless unchanged.has_key?(xi)
      changes << [i, '-', xi]
    end
  end
  y.each_with_index do |yj,j|
    unless unchanged.has_value?(yj)
      changes << [j, '+', yj]
    end
  end
  # order the changes by index to match the behavior of `tdiff`
  changes.sort_by { |change| change[0] }.each do |index,change,node|
    yield change, node
  end
  # explicitly release the changes variable
  changes = nil
  # recurse down the unchanged nodes
  unchanged.each do |xi,yj|
    xi.tdiff_recursive_unordered(yj,&block)
  end
  unchanged = nil
end

def tdiff_unordered(tree,&block)

Other tags:
    Since: - 0.2.0

Returns:
  • (Enumerator) -

Other tags:
    Yieldparam: node -
    Yieldparam: change -

Other tags:
    Yield: -

Parameters:
  • tree (#tdiff_each_child) --
def tdiff_unordered(tree,&block)
  return enum_for(:tdiff_unordered,tree) unless block
  # check if the nodes differ
  unless tdiff_equal(tree)
    yield '-', self
    yield '+', tree
    return self
  end
  yield ' ', self
  tdiff_recursive_unordered(tree,&block)
  return self
end