global

def patch(src, patchset, direction = nil)

representations of Diff::LCS::Change objects will be reified.
the array representations of those objects. Prior to application, array
sequences containing either Diff::LCS::Change objects (or a subclass) or
The +patch+ method accepts patchsets that are enumerable

]
]
# change
[ # hunk
# change
[ # patchset

sequence of changes:
changes, or a mix of the two. A hunk of changes is an enumerable
A +patchset+ is always an enumerable sequence of changes, hunks of

=== Patchsets

patchset.flatten.all? { |change| change.unchanged? }
patchset.empty? or

having no changes if the following predicate returns true:
as either src.dup or +src+. A +patchset+ can be deemed as
If the +patchset+ contains no changes, the +src+ value will be returned

patch(s2, diff(s1, s2)) -> s1

the following expression is true:
A +patchset+ can be considered to apply backward (:unpatch) if

patch(s1, diff(s1, s2)) -> s2

following expression is true:
A +patchset+ can be considered to apply forward (:patch) if the

discover the direction of the +patchset+.
If the +direction+ is not specified, Diff::LCS::patch will attempt to

(:patch or :unpatch), producing a new sequence.
Applies a +patchset+ to the sequence +src+ according to the +direction+
def patch(src, patchset, direction = nil)
  # Normalize the patchset.
  has_changes, patchset = Diff::LCS::Internals.analyze_patchset(patchset)
  if not has_changes
    return src.dup if src.respond_to? :dup
    return src
  end
  string = src.kind_of?(String)
  # Start with a new empty type of the source's class
  res = src.class.new
  direction ||= Diff::LCS::Internals.intuit_diff_direction(src, patchset)
  ai = bj = 0
  patch_map = PATCH_MAP[direction]
  patchset.flatten.each do |change|
    # Both Change and ContextChange support #action
    action = patch_map[change.action]
    case change
    when Diff::LCS::ContextChange
      case direction
      when :patch
        el = change.new_element
        op = change.old_position
        np = change.new_position
      when :unpatch
        el = change.old_element
        op = change.new_position
        np = change.old_position
      end
      case action
      when '-' # Remove details from the old string
        while ai < op
          res << (string ? src[ai, 1] : src[ai])
          ai += 1
          bj += 1
        end
        ai += 1
      when '+'
        while bj < np
          res << (string ? src[ai, 1] : src[ai])
          ai += 1
          bj += 1
        end
      res << el
      bj += 1
      when '='
        # This only appears in sdiff output with the SDiff callback.
        # Therefore, we only need to worry about dealing with a single
        # element.
        res << el
        ai += 1
        bj += 1
      when '!'
        while ai < op
          res << (string ? src[ai, 1] : src[ai])
          ai += 1
          bj += 1
        end
      bj += 1
      ai += 1
      res << el
      end
    when Diff::LCS::Change
      case action
      when '-'
        while ai < change.position
          res << (string ? src[ai, 1] : src[ai])
          ai += 1
          bj += 1
        end
      ai += 1
      when '+'
        while bj < change.position
          res << (string ? src[ai, 1] : src[ai])
          ai += 1
          bj += 1
        end
      bj += 1
      res << change.element
      end
    end
  end
  while ai < src.size
    res << (string ? src[ai, 1] : src[ai])
    ai += 1
    bj += 1
  end
  res
end