Skip to content

Commit 895adcb

Browse files
author
José Valim
committed
Rearrange equals and inserts for shorter diff scripts
Closes #7169.
1 parent e6e6f8d commit 895adcb

File tree

2 files changed

+33
-12
lines changed

2 files changed

+33
-12
lines changed

lib/elixir/lib/list.ex

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -885,19 +885,24 @@ defmodule List do
885885
compact_reverse(rest, [{kind, [elem | result]} | acc])
886886
end
887887

888+
defp compact_reverse(rest, [{:eq, elem}, {:ins, elem}, {:eq, other} | acc]) do
889+
compact_reverse(rest, [{:ins, elem}, {:eq, elem ++ other} | acc])
890+
end
891+
888892
defp compact_reverse([{kind, elem} | rest], acc) do
889893
compact_reverse(rest, [{kind, [elem]} | acc])
890894
end
891895

892896
defp each_diagonal(diag, limit, _paths, next_paths) when diag > limit do
893-
{:next, Enum.reverse(next_paths)}
897+
{:next, :lists.reverse(next_paths)}
894898
end
895899

896900
defp each_diagonal(diag, limit, paths, next_paths) do
897901
{path, rest} = proceed_path(diag, limit, paths)
898902

899-
with {:cont, path} <- follow_snake(path) do
900-
each_diagonal(diag + 2, limit, rest, [path | next_paths])
903+
case follow_snake(path) do
904+
{:cont, path} -> each_diagonal(diag + 2, limit, rest, [path | next_paths])
905+
{:done, edits} -> {:done, edits}
901906
end
902907
end
903908

lib/elixir/test/elixir/list_test.exs

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -217,14 +217,30 @@ defmodule ListTest do
217217
end
218218
end
219219

220-
test "myers_difference/2" do
221-
assert List.myers_difference([], []) == []
222-
assert List.myers_difference([], [1, 2, 3]) == [ins: [1, 2, 3]]
223-
assert List.myers_difference([1, 2, 3], []) == [del: [1, 2, 3]]
224-
assert List.myers_difference([1, 2, 3], [1, 2, 3]) == [eq: [1, 2, 3]]
225-
assert List.myers_difference([1, 2, 3], [1, 4, 2, 3]) == [eq: [1], ins: [4], eq: [2, 3]]
226-
assert List.myers_difference([1, 4, 2, 3], [1, 2, 3]) == [eq: [1], del: [4], eq: [2, 3]]
227-
assert List.myers_difference([1], [[1]]) == [del: [1], ins: [[1]]]
228-
assert List.myers_difference([[1]], [1]) == [del: [[1]], ins: [1]]
220+
describe "myers_difference/2" do
221+
test "follows paper implementation" do
222+
assert List.myers_difference([], []) == []
223+
assert List.myers_difference([], [1, 2, 3]) == [ins: [1, 2, 3]]
224+
assert List.myers_difference([1, 2, 3], []) == [del: [1, 2, 3]]
225+
assert List.myers_difference([1, 2, 3], [1, 2, 3]) == [eq: [1, 2, 3]]
226+
assert List.myers_difference([1, 2, 3], [1, 4, 2, 3]) == [eq: [1], ins: [4], eq: [2, 3]]
227+
assert List.myers_difference([1, 4, 2, 3], [1, 2, 3]) == [eq: [1], del: [4], eq: [2, 3]]
228+
assert List.myers_difference([1], [[1]]) == [del: [1], ins: [[1]]]
229+
assert List.myers_difference([[1]], [1]) == [del: [[1]], ins: [1]]
230+
end
231+
232+
test "rearranges inserts and equals for smaller diffs" do
233+
assert List.myers_difference([3, 2, 0, 2], [2, 2, 0, 2]) ==
234+
[del: [3], ins: [2], eq: [2, 0, 2]]
235+
236+
assert List.myers_difference([3, 2, 1, 0, 2], [2, 1, 2, 1, 0, 2]) ==
237+
[del: [3], ins: [2, 1], eq: [2, 1, 0, 2]]
238+
239+
assert List.myers_difference([3, 2, 2, 1, 0, 2], [2, 2, 1, 2, 1, 0, 2]) ==
240+
[del: [3], eq: [2, 2, 1], ins: [2, 1], eq: [0, 2]]
241+
242+
assert List.myers_difference([3, 2, 0, 2], [2, 2, 1, 0, 2]) ==
243+
[del: [3], eq: [2], ins: [2, 1], eq: [0, 2]]
244+
end
229245
end
230246
end

0 commit comments

Comments
 (0)