module Diffable

Public Instance Methods

diff(b) click to toggle source
# File lib/array_diff.rb, line 197
def diff(b)
  ArrayDiff.new(self, b)
end
patch(diff) click to toggle source
# File lib/array_diff.rb, line 244
def patch(diff)
  newary = nil
  if diff.difftype == String
    newary = diff.difftype.new('')
  else
    newary = diff.difftype.new
  end
  ai = 0
  bi = 0
  diff.diffs.each { |d|
    d.each { |mod|
  case mod[0]
  when '-'
    while ai < mod[1]
      newary << self[ai]
      ai += 1
      bi += 1
    end
    ai += 1
  when '+'
    while bi < mod[1]
      newary << self[ai]
      ai += 1
      bi += 1
    end
    newary << mod[2]
    bi += 1
  else
    raise "Unknown diff action"
  end
    }
  }
  while ai < self.length
    newary << self[ai]
    ai += 1
    bi += 1
  end
  return newary
end
replacenextlarger(value, high = nil) click to toggle source
# File lib/array_diff.rb, line 217
def replacenextlarger(value, high = nil)
  high ||= self.length
  if self.empty? || value > self[-1]
    push value
    return high
  end
  # binary search for replacement point
  low = 0
  while low < high
    index = (high+low)/2
    found = self[index]
    return nil if value == found
    if value > found
  low = index + 1
    else
  high = index
    end
  end

  self[low] = value
  # $stderr << "replace #{value} : 0/#{low}/#{init_high} (#{steps} steps) (#{init_high-low} off )\n"
  # $stderr.puts self.inspect
  #gets
  #p length - low
  return low
end
reverse_hash(range = (0...self.length)) click to toggle source

Create a hash that maps elements of the array to arrays of indices where the elements are found.

# File lib/array_diff.rb, line 204
def reverse_hash(range = (0...self.length))
  revmap = {}
  range.each { |i|
    elem = self[i]
    if revmap.has_key? elem
  revmap[elem].push i
    else
  revmap[elem] = [i]
    end
  }
  return revmap
end