class Diff::LCS::Change
Represents a simplistic (non-contextual) change. Represents the removal or addition of an element from either the old or the new sequenced enumerable.
Constants
- VALID_ACTIONS
-
The only actions valid for changes are ‘+’ (add), ‘-’ (delete), ‘=’ (no change), ‘!’ (changed), ‘<’ (tail changes from first sequence), or ‘>’ (tail changes from second sequence). The last two (‘<>’) are only found with Diff::LCS::diff and Diff::LCS::sdiff.
Attributes
Returns the action this Change represents.
Returns the position of the Change.
Public Class Methods
# File lib/diff/lcs/change.rb, line 44 def self.from_a(arr) case arr in [action, [old_position, old_element], [new_position, new_element]] Diff::LCS::ContextChange[action, old_position, old_element, new_position, new_element] in [action, position, element] new(action, position, element) else fail "Invalid change array format provided." end end
Returns the sequence element of the Change. :attr_reader: element
Calls superclass method
# File lib/diff/lcs/change.rb, line 29 def initialize(action:, position:, element:) fail "Invalid Change Action '#{action}'" unless Diff::LCS::Change.valid_action?(action) fail "Invalid Position Type" unless position.is_a?(Integer) super end
# File lib/diff/lcs/change.rb, line 15 def self.valid_action?(action) = VALID_ACTIONS.include?(action) ## # Returns the action this Change represents. # :attr_reader: action ## # Returns the position of the Change. # :attr_reader: position ## # Returns the sequence element of the Change. # :attr_reader: element def initialize(action:, position:, element:) fail "Invalid Change Action '#{action}'" unless Diff::LCS::Change.valid_action?(action) fail "Invalid Position Type" unless position.is_a?(Integer) super end def inspect(*_args) = "#<#{self.class}: #{to_a.inspect}>" def to_a = [action, position, element] alias_method :to_ary, :to_a alias_method :deconstruct, :to_a def deconstruct_keys(_) = {action:, position:, element:} def self.from_a(arr) case arr in [action, [old_position, old_element], [new_position, new_element]] Diff::LCS::ContextChange[action, old_position, old_element, new_position, new_element] in [action, position, element] new(action, position, element) else fail "Invalid change array format provided." end end include Comparable def ==(other) (self.class == other.class) and (action == other.action) and (position == other.position) and (element == other.element) end def <=>(other) r = position <=> other.position r = VALID_ACTIONS.index(action) <=> VALID_ACTIONS.index(other.action) if r.zero? r = element <=> other.element if r.zero? r end def adding? = action == "+" def deleting? = action == "-" def unchanged? = action == "=" def changed? = action == "!" def finished_a? = action == ">" def finished_b? = action == "<" end # Represents a contextual change. Contains the position and values of the elements in the # old and the new sequenced enumerable values as well as the action taken. class Diff::LCS::ContextChange ## # Returns the action this Change represents. # :attr_reader: action ## # Returns the old position being changed. # :attr_reader: old_position ## # Returns the new position being changed. # :attr_reader: new_position ## # Returns the old element being changed. # :attr_reader: old_element ## # Returns the new element being changed. # :attr_reader: new_element def initialize(action:, old_position:, old_element:, new_position:, new_element:) fail "Invalid Change Action '#{action}'" unless Diff::LCS::Change.valid_action?(action) fail "Invalid (Old) Position Type" unless old_position.nil? || old_position.is_a?(Integer) fail "Invalid (New) Position Type" unless new_position.nil? || new_position.is_a?(Integer) super end def to_a = [action, [old_position, old_element], [new_position, new_element]] alias_method :to_ary, :to_a alias_method :deconstruct, :to_a def deconstruct_keys(_) = {action:, old_position:, old_element:, new_position:, new_element:} def self.from_a(arr) = Diff::LCS::Change.from_a(arr) # Simplifies a context change for use in some diff callbacks. '<' actions are converted # to '-' and '>' actions are converted to '+'. def self.simplify(event) case event.action when "-" event.with(new_element: nil) when "<" event.with(action: "-", new_element: nil) when "+" event.with(old_element: nil) when ">" event.with(action: "+", old_element: nil) else event end end def ==(other) (self.class == other.class) && (action == other.action) && (old_position == other.old_position) && (new_position == other.new_position) && (old_element == other.old_element) && (new_element == other.new_element) end def <=>(other) r = old_position <=> other.old_position r = new_position <=> other.new_position if r.zero? if r.zero? r = Diff::LCS::Change::VALID_ACTIONS.index(action) <=> Diff::LCS::Change::VALID_ACTIONS.index(other.action) end r = old_element <=> other.old_element if r.zero? r = new_element <=> other.new_element if r.zero? r end def adding? = action == "+" def deleting? = action == "-" def unchanged? = action == "=" def changed? =
Public Instance Methods
# File lib/diff/lcs/change.rb, line 64 def <=>(other) r = position <=> other.position r = VALID_ACTIONS.index(action) <=> VALID_ACTIONS.index(other.action) if r.zero? r = element <=> other.element if r.zero? r end
# File lib/diff/lcs/change.rb, line 57 def ==(other) (self.class == other.class) and (action == other.action) and (position == other.position) and (element == other.element) end
# File lib/diff/lcs/change.rb, line 71 def adding? = action == "+" def deleting? = action == "-" def unchanged? = action == "=" def changed? = action == "!" def finished_a? = action == ">" def finished_b? = action == "<" end # Represents a contextual change. Contains the position and values of the elements in the # old and the new sequenced enumerable values as well as the action taken. class Diff::LCS::ContextChange ## # Returns the action this Change represents. # :attr_reader: action ## # Returns the old position being changed. # :attr_reader: old_position ## # Returns the new position being changed. # :attr_reader: new_position ## # Returns the old element being changed. # :attr_reader: old_element ## # Returns the new element being changed. # :attr_reader: new_element def initialize(action:, old_position:, old_element:, new_position:, new_element:) fail "Invalid Change Action '#{action}'" unless Diff::LCS::Change.valid_action?(action) fail "Invalid (Old) Position Type" unless old_position.nil? || old_position.is_a?(Integer) fail "Invalid (New) Position Type" unless new_position.nil? || new_position.is_a?(Integer) super end def to_a = [action, [old_position, old_element], [new_position, new_element]] alias_method :to_ary, :to_a alias_method :deconstruct, :to_a def deconstruct_keys(_) = {action:, old_position:, old_element:, new_position:, new_element:} def self.from_a(arr) = Diff::LCS::Change.from_a(arr) # Simplifies a context change for use in some diff callbacks. '<' actions are converted # to '-' and '>' actions are converted to '+'. def self.simplify(event) case event.action when "-" event.with(new_element: nil) when "<" event.with(action: "-", new_element: nil) when "+" event.with(old_element: nil) when ">" event.with(action: "+", old_element: nil) else event end end def ==(other) (self.class == other.class) && (action == other.action) && (old_position == other.old_position) && (new_position == other.new_position) && (old_element == other.old_element) && (new_element == other.new_element) end def <=>(other) r = old_position <=> other.old_position r = new_position <=> other.new_position if r.zero? if r.zero? r = Diff::LCS::Change::VALID_ACTIONS.index(action) <=> Diff::LCS::Change::VALID_ACTIONS.index(other.action) end r = old_element <=> other.old_element if r.zero? r = new_element <=> other.new_element if r.zero? r end def adding? = action == "+" def deleting? = action == "-" def unchanged? = action == "=" def changed? = action == "!"
# File lib/diff/lcs/change.rb, line 77 def changed? = action == "!" def finished_a? = action == ">" def finished_b? = action == "<" end # Represents a contextual change. Contains the position and values of the elements in the # old and the new sequenced enumerable values as well as the action taken. class Diff::LCS::ContextChange ## # Returns the action this Change represents. # :attr_reader: action ## # Returns the old position being changed. # :attr_reader: old_position ## # Returns the new position being changed. # :attr_reader: new_position ## # Returns the old element being changed. # :attr_reader: old_element ## # Returns the new element being changed. # :attr_reader: new_element def initialize(action:, old_position:, old_element:, new_position:, new_element:) fail "Invalid Change Action '#{action}'" unless Diff::LCS::Change.valid_action?(action) fail "Invalid (Old) Position Type" unless old_position.nil? || old_position.is_a?(Integer) fail "Invalid (New) Position Type" unless new_position.nil? || new_position.is_a?(Integer) super end def to_a = [action, [old_position, old_element], [new_position, new_element]] alias_method :to_ary, :to_a alias_method :deconstruct, :to_a def deconstruct_keys(_) = {action:, old_position:, old_element:, new_position:, new_element:} def self.from_a(arr) = Diff::LCS::Change.from_a(arr) # Simplifies a context change for use in some diff callbacks. '<' actions are converted # to '-' and '>' actions are converted to '+'. def self.simplify(event) case event.action when "-" event.with(new_element: nil) when "<" event.with(action: "-", new_element: nil) when "+" event.with(old_element: nil) when ">" event.with(action: "+", old_element: nil) else event end end def ==(other) (self.class == other.class) && (action == other.action) && (old_position == other.old_position) && (new_position == other.new_position) && (old_element == other.old_element) && (new_element == other.new_element) end def <=>(other) r = old_position <=> other.old_position r = new_position <=> other.new_position if r.zero? if r.zero? r = Diff::LCS::Change::VALID_ACTIONS.index(action) <=> Diff::LCS::Change::VALID_ACTIONS.index(other.action) end r = old_element <=> other.old_element if r.zero? r = new_element <=> other.new_element if r.zero? r end def adding? = action == "+" def deleting? = action == "-" def unchanged? = action == "=" def changed? = action == "!" def finished_a? =
# File lib/diff/lcs/change.rb, line 42 def deconstruct_keys(_) = {action:, position:, element:} def self.from_a(arr) case arr in [action, [old_position, old_element], [new_position, new_element]] Diff::LCS::ContextChange[action, old_position, old_element, new_position, new_element] in [action, position, element] new(action, position, element) else fail "Invalid change array format provided." end end include Comparable def ==(other) (self.class == other.class) and (action == other.action) and (position == other.position) and (element == other.element) end def <=>(other) r = position <=> other.position r = VALID_ACTIONS.index(action) <=> VALID_ACTIONS.index(other.action) if r.zero? r = element <=> other.element if r.zero? r end def adding? = action == "+" def deleting? = action == "-" def unchanged? = action == "=" def changed? = action == "!" def finished_a? = action == ">" def finished_b? = action == "<" end # Represents a contextual change. Contains the position and values of the elements in the # old and the new sequenced enumerable values as well as the action taken. class Diff::LCS::ContextChange ## # Returns the action this Change represents. # :attr_reader: action ## # Returns the old position being changed. # :attr_reader: old_position ## # Returns the new position being changed. # :attr_reader: new_position ## # Returns the old element being changed. # :attr_reader: old_element ## # Returns the new element being changed. # :attr_reader: new_element def initialize(action:, old_position:, old_element:, new_position:, new_element:) fail "Invalid Change Action '#{action}'" unless Diff::LCS::Change.valid_action?(action) fail "Invalid (Old) Position Type" unless old_position.nil? || old_position.is_a?(Integer) fail "Invalid (New) Position Type" unless new_position.nil? || new_position.is_a?(Integer) super end def to_a = [action, [old_position, old_element], [new_position, new_element]] alias_method :to_ary, :to_a alias_method :deconstruct, :to_a def deconstruct_keys(_) = {action:, old_position:, old_element:, new_position:, new_element:} def self.from_a(arr) = Diff::LCS::Change.from_a(arr) # Simplifies a context change for use in some diff callbacks. '<' actions are converted # to '-' and '>' actions are converted to '+'. def self.simplify(event) case event.action when "-" event.with(new_element: nil) when "<" event.with(action: "-", new_element: nil) when "+" event.with(old_element: nil) when ">" event.with(action: "+", old_element: nil) else event end end def ==(other) (self.class == other.class) && (action == other.action) && (old_position == other.old_position) && (new_position == other.new_position) && (old_element == other.old_element) && (new_element == other.new_element) end def <=>(other) r = old_position <=> other.old_position r = new_position <=> other.new_position if r.zero? if r.zero? r = Diff::LCS::Change::VALID_ACTIONS.index(action) <=> Diff::LCS::Change::VALID_ACTIONS.index(other.action) end r = old_element <=> other.old_element if r.zero? r = new_element <=> other.new_element if r.zero? r end def adding? = action == "+" def deleting? = action == "-" def unchanged? = action == "=" def changed? = action == "!"
# File lib/diff/lcs/change.rb, line 73 def deleting? = action == "-" def unchanged? = action == "=" def changed? = action == "!" def finished_a? = action == ">" def finished_b? = action == "<" end # Represents a contextual change. Contains the position and values of the elements in the # old and the new sequenced enumerable values as well as the action taken. class Diff::LCS::ContextChange ## # Returns the action this Change represents. # :attr_reader: action ## # Returns the old position being changed. # :attr_reader: old_position ## # Returns the new position being changed. # :attr_reader: new_position ## # Returns the old element being changed. # :attr_reader: old_element ## # Returns the new element being changed. # :attr_reader: new_element def initialize(action:, old_position:, old_element:, new_position:, new_element:) fail "Invalid Change Action '#{action}'" unless Diff::LCS::Change.valid_action?(action) fail "Invalid (Old) Position Type" unless old_position.nil? || old_position.is_a?(Integer) fail "Invalid (New) Position Type" unless new_position.nil? || new_position.is_a?(Integer) super end def to_a = [action, [old_position, old_element], [new_position, new_element]] alias_method :to_ary, :to_a alias_method :deconstruct, :to_a def deconstruct_keys(_) = {action:, old_position:, old_element:, new_position:, new_element:} def self.from_a(arr) = Diff::LCS::Change.from_a(arr) # Simplifies a context change for use in some diff callbacks. '<' actions are converted # to '-' and '>' actions are converted to '+'. def self.simplify(event) case event.action when "-" event.with(new_element: nil) when "<" event.with(action: "-", new_element: nil) when "+" event.with(old_element: nil) when ">" event.with(action: "+", old_element: nil) else event end end def ==(other) (self.class == other.class) && (action == other.action) && (old_position == other.old_position) && (new_position == other.new_position) && (old_element == other.old_element) && (new_element == other.new_element) end def <=>(other) r = old_position <=> other.old_position r = new_position <=> other.new_position if r.zero? if r.zero? r = Diff::LCS::Change::VALID_ACTIONS.index(action) <=> Diff::LCS::Change::VALID_ACTIONS.index(other.action) end r = old_element <=> other.old_element if r.zero? r = new_element <=> other.new_element if r.zero? r end def adding? = action == "+" def deleting? = action == "-" def unchanged? = action == "=" def changed? = action == "!" def
# File lib/diff/lcs/change.rb, line 79 def finished_a? = action == ">" def finished_b? = action == "<" end # Represents a contextual change. Contains the position and values of the elements in the # old and the new sequenced enumerable values as well as the action taken. class Diff::LCS::ContextChange ## # Returns the action this Change represents. # :attr_reader: action ## # Returns the old position being changed. # :attr_reader: old_position ## # Returns the new position being changed. # :attr_reader: new_position ## # Returns the old element being changed. # :attr_reader: old_element ## # Returns the new element being changed. # :attr_reader: new_element def initialize(action:, old_position:, old_element:, new_position:, new_element:) fail "Invalid Change Action '#{action}'" unless Diff::LCS::Change.valid_action?(action) fail "Invalid (Old) Position Type" unless old_position.nil? || old_position.is_a?(Integer) fail "Invalid (New) Position Type" unless new_position.nil? || new_position.is_a?(Integer) super end def to_a = [action, [old_position, old_element], [new_position, new_element]] alias_method :to_ary, :to_a alias_method :deconstruct, :to_a def deconstruct_keys(_) = {action:, old_position:, old_element:, new_position:, new_element:} def self.from_a(arr) = Diff::LCS::Change.from_a(arr) # Simplifies a context change for use in some diff callbacks. '<' actions are converted # to '-' and '>' actions are converted to '+'. def self.simplify(event) case event.action when "-" event.with(new_element: nil) when "<" event.with(action: "-", new_element: nil) when "+" event.with(old_element: nil) when ">" event.with(action: "+", old_element: nil) else event end end def ==(other) (self.class == other.class) && (action == other.action) && (old_position == other.old_position) && (new_position == other.new_position) && (old_element == other.old_element) && (new_element == other.new_element) end def <=>(other) r = old_position <=> other.old_position r = new_position <=> other.new_position if r.zero? if r.zero? r = Diff::LCS::Change::VALID_ACTIONS.index(action) <=> Diff::LCS::Change::VALID_ACTIONS.index(other.action) end r = old_element <=> other.old_element if r.zero? r = new_element <=> other.new_element if r.zero? r end def adding? = action == "+" def deleting? = action == "-" def unchanged? = action == "=" def changed? = action == "!" def finished_a? = action
# File lib/diff/lcs/change.rb, line 81 def finished_b? = action == "<" end
# File lib/diff/lcs/change.rb, line 36 def inspect(*_args) = "#<#{self.class}: #{to_a.inspect}>" def to_a = [action, position, element] alias_method :to_ary, :to_a alias_method :deconstruct, :to_a def deconstruct_keys(_) = {action:, position:, element:} def self.from_a(arr) case arr in [action, [old_position, old_element], [new_position, new_element]] Diff::LCS::ContextChange[action, old_position, old_element, new_position, new_element] in [action, position, element] new(action, position, element) else fail "Invalid change array format provided." end end include Comparable def ==(other) (self.class == other.class) and (action == other.action) and (position == other.position) and (element == other.element) end def <=>(other) r = position <=> other.position r = VALID_ACTIONS.index(action) <=> VALID_ACTIONS.index(other.action) if r.zero? r = element <=> other.element if r.zero? r end def adding? = action == "+" def deleting? = action == "-" def unchanged? = action == "=" def changed? = action == "!" def finished_a? = action == ">" def finished_b? = action == "<" end # Represents a contextual change. Contains the position and values of the elements in the # old and the new sequenced enumerable values as well as the action taken. class Diff::LCS::ContextChange ## # Returns the action this Change represents. # :attr_reader: action ## # Returns the old position being changed. # :attr_reader: old_position ## # Returns the new position being changed. # :attr_reader: new_position ## # Returns the old element being changed. # :attr_reader: old_element ## # Returns the new element being changed. # :attr_reader: new_element def initialize(action:, old_position:, old_element:, new_position:, new_element:) fail "Invalid Change Action '#{action}'" unless Diff::LCS::Change.valid_action?(action) fail "Invalid (Old) Position Type" unless old_position.nil? || old_position.is_a?(Integer) fail "Invalid (New) Position Type" unless new_position.nil? || new_position.is_a?(Integer) super end def to_a = [action, [old_position, old_element], [new_position, new_element]] alias_method :to_ary, :to_a alias_method :deconstruct, :to_a def deconstruct_keys(_) = {action:, old_position:, old_element:, new_position:, new_element:} def self.from_a(arr) = Diff::LCS::Change.from_a(arr) # Simplifies a context change for use in some diff callbacks. '<' actions are converted # to '-' and '>' actions are converted to '+'. def self.simplify(event) case event.action when "-" event.with(new_element: nil) when "<" event.with(action: "-", new_element: nil) when "+" event.with(old_element: nil) when ">" event.with(action: "+", old_element: nil) else event end end def ==(other) (self.class == other.class) && (action == other.action) && (old_position == other.old_position) && (new_position == other.new_position) && (old_element == other.old_element) && (new_element == other.new_element) end def <=>(other) r = old_position <=> other.old_position r = new_position <=> other.new_position if r.zero? if r.zero? r = Diff::LCS::Change::VALID_ACTIONS.index(action) <=> Diff::LCS::Change::VALID_ACTIONS.index(other.action) end r = old_element <=> other.old_element if r.zero? r = new_element <=> other.new_element if r.zero? r end def adding? = action == "+" def deleting? = action == "-" def unchanged? = action == "=" def changed? = action
# File lib/diff/lcs/change.rb, line 38 def to_a = [action, position, element] alias_method :to_ary, :to_a alias_method :deconstruct, :to_a def deconstruct_keys(_) = {action:, position:, element:} def self.from_a(arr) case arr in [action, [old_position, old_element], [new_position, new_element]] Diff::LCS::ContextChange[action, old_position, old_element, new_position, new_element] in [action, position, element] new(action, position, element) else fail "Invalid change array format provided." end end include Comparable def ==(other) (self.class == other.class) and (action == other.action) and (position == other.position) and (element == other.element) end def <=>(other) r = position <=> other.position r = VALID_ACTIONS.index(action) <=> VALID_ACTIONS.index(other.action) if r.zero? r = element <=> other.element if r.zero? r end def adding? = action == "+" def deleting? = action == "-" def unchanged? = action == "=" def changed? = action == "!" def finished_a? = action == ">" def finished_b? = action == "<" end # Represents a contextual change. Contains the position and values of the elements in the # old and the new sequenced enumerable values as well as the action taken. class Diff::LCS::ContextChange ## # Returns the action this Change represents. # :attr_reader: action ## # Returns the old position being changed. # :attr_reader: old_position ## # Returns the new position being changed. # :attr_reader: new_position ## # Returns the old element being changed. # :attr_reader: old_element ## # Returns the new element being changed. # :attr_reader: new_element def initialize(action:, old_position:, old_element:, new_position:, new_element:) fail "Invalid Change Action '#{action}'" unless Diff::LCS::Change.valid_action?(action) fail "Invalid (Old) Position Type" unless old_position.nil? || old_position.is_a?(Integer) fail "Invalid (New) Position Type" unless new_position.nil? || new_position.is_a?(Integer) super end def to_a = [action, [old_position, old_element], [new_position, new_element]] alias_method :to_ary, :to_a alias_method :deconstruct, :to_a def deconstruct_keys(_) = {action:, old_position:, old_element:, new_position:, new_element:} def self.from_a(arr) = Diff::LCS::Change.from_a(arr) # Simplifies a context change for use in some diff callbacks. '<' actions are converted # to '-' and '>' actions are converted to '+'. def self.simplify(event) case event.action when "-" event.with(new_element: nil) when "<" event.with(action: "-", new_element: nil) when "+" event.with(old_element: nil) when ">" event.with(action: "+", old_element: nil) else event end end def ==(other) (self.class == other.class) && (action == other.action) && (old_position == other.old_position) && (new_position == other.new_position) && (old_element == other.old_element) && (new_element == other.new_element) end def <=>(other) r = old_position <=> other.old_position r = new_position <=> other.new_position if r.zero? if r.zero? r = Diff::LCS::Change::VALID_ACTIONS.index(action) <=> Diff::LCS::Change::VALID_ACTIONS.index(other.action) end r = old_element <=> other.old_element if r.zero? r = new_element <=> other.new_element if r.zero? r end def adding? = action == "+" def deleting? = action == "-" def unchanged? = action == "=" def changed? = action ==
# File lib/diff/lcs/change.rb, line 75 def unchanged? = action == "=" def changed? = action == "!" def finished_a? = action == ">" def finished_b? = action == "<" end # Represents a contextual change. Contains the position and values of the elements in the # old and the new sequenced enumerable values as well as the action taken. class Diff::LCS::ContextChange ## # Returns the action this Change represents. # :attr_reader: action ## # Returns the old position being changed. # :attr_reader: old_position ## # Returns the new position being changed. # :attr_reader: new_position ## # Returns the old element being changed. # :attr_reader: old_element ## # Returns the new element being changed. # :attr_reader: new_element def initialize(action:, old_position:, old_element:, new_position:, new_element:) fail "Invalid Change Action '#{action}'" unless Diff::LCS::Change.valid_action?(action) fail "Invalid (Old) Position Type" unless old_position.nil? || old_position.is_a?(Integer) fail "Invalid (New) Position Type" unless new_position.nil? || new_position.is_a?(Integer) super end def to_a = [action, [old_position, old_element], [new_position, new_element]] alias_method :to_ary, :to_a alias_method :deconstruct, :to_a def deconstruct_keys(_) = {action:, old_position:, old_element:, new_position:, new_element:} def self.from_a(arr) = Diff::LCS::Change.from_a(arr) # Simplifies a context change for use in some diff callbacks. '<' actions are converted # to '-' and '>' actions are converted to '+'. def self.simplify(event) case event.action when "-" event.with(new_element: nil) when "<" event.with(action: "-", new_element: nil) when "+" event.with(old_element: nil) when ">" event.with(action: "+", old_element: nil) else event end end def ==(other) (self.class == other.class) && (action == other.action) && (old_position == other.old_position) && (new_position == other.new_position) && (old_element == other.old_element) && (new_element == other.new_element) end def <=>(other) r = old_position <=> other.old_position r = new_position <=> other.new_position if r.zero? if r.zero? r = Diff::LCS::Change::VALID_ACTIONS.index(action) <=> Diff::LCS::Change::VALID_ACTIONS.index(other.action) end r = old_element <=> other.old_element if r.zero? r = new_element <=> other.new_element if r.zero? r end def adding? = action == "+" def deleting? = action == "-" def unchanged? = action == "=" def changed? = action == "!" def finished_a?