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

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object

Includes TDiff.



14
15
16
# File 'lib/tdiff/unordered.rb', line 14

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

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.

Parameters:

Yields:

  • (change, node)

    The given block will be passed the added or removed nodes.

Yield Parameters:

  • change (' ', '+', '-')

    The state-change of the node.

  • node (Object)

    A node from one of the two trees.

Since:

  • 0.3.2



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.

Parameters:

Yields:

  • (change, node)

    The given block will be passed the added or removed nodes.

Yield Parameters:

  • change (' ', '+', '-')

    The state-change of the node.

  • node (Object)

    A node from one of the two trees.

Returns:

  • (Enumerator)

    If no block is given, an Enumerator object will be returned.

Since:

  • 0.2.0



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