Module: TDiff::Unordered
- Defined in:
- lib/tdiff/unordered.rb
Overview
Calculates the differences between two trees, without respecting the order of children nodes.
Class Method Summary collapse
-
.included(base) ⇒ Object
Includes TDiff.
Instance Method Summary collapse
-
#tdiff_recursive_unordered(tree) {|change, node| ... } ⇒ Object
protected
Recursively compares the differences between the children nodes, without respecting the order of the nodes.
-
#tdiff_unordered(tree) {|change, node| ... } ⇒ Enumerator
Finds the differences between
self
and another tree, not respecting the order of the nodes.
Class Method Details
Instance Method Details
#tdiff_recursive_unordered(tree) {|change, node| ... } ⇒ Object (protected)
Recursively compares the differences between the children nodes, without respecting the order of the nodes.
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
# File 'lib/tdiff/unordered.rb', line 75 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 |
#tdiff_unordered(tree) {|change, node| ... } ⇒ Enumerator
Finds the differences between self
and another tree, not respecting
the order of the nodes.
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/tdiff/unordered.rb', line 39 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 |