def self.diff_array_lcs(a, b, options = {})
opts = {
:prefix => '',
:similarity => 0.8,
:delimiter => '.'
}.merge!(options)
change_set = []
if a.size == 0 and b.size == 0
return []
elsif a.size == 0
b.each_index do |index|
change_set << ['+', index, b[index]]
end
return change_set
elsif b.size == 0
a.each_index do |index|
i = a.size - index - 1
change_set << ['-', i, a[i]]
end
return change_set
end
links = lcs(a, b, opts)
yield links if block_given?
links << [a.size, b.size]
last_x = -1
last_y = -1
links.each do |pair|
x, y = pair
(x > last_x + 1) and (x - last_x - 2).downto(0).each do |i|
change_set << ['-', last_y + i + 1, a[i + last_x + 1]]
end
(y > last_y + 1) and 0.upto(y - last_y - 2).each do |i|
change_set << ['+', last_y + i + 1, b[i + last_y + 1]]
end
last_x = x
last_y = y
end
change_set
end