Skip to content

Commit 1079b7a

Browse files
Gabriella439mergify[bot]
authored andcommitted
Improve diffs for lists (#1585)
Now the diff for lists will descend into diffs for elements when reasonable to do so
1 parent 8d3c4e4 commit 1079b7a

File tree

4 files changed

+24
-3
lines changed

4 files changed

+24
-3
lines changed

dhall/src/Dhall/Diff.hs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -361,15 +361,23 @@ diffChunks cL cR
361361
diffList
362362
:: (Eq a, Pretty a)
363363
=> Seq (Expr Void a) -> Seq (Expr Void a) -> Diff
364-
diffList l r = bracketed (foldMap diffPart parts)
364+
diffList l r = bracketed (loop parts)
365365
where
366366
-- Sections of the list that are only in left, only in right, or in both
367-
parts =
368-
Algo.Diff.getGroupedDiffBy ((same .) . diff) (toList l) (toList r)
367+
parts₀ = Algo.Diff.getGroupedDiffBy equal (toList l) (toList r)
368+
369+
equal a b = same (diff a b)
369370

370371
-- Render each element of a list using an extra rendering function f
371372
prettyElems f = map (f . token . Internal.prettyExpr)
372373

374+
loop [] =
375+
mempty
376+
loop (Algo.Diff.First as : Algo.Diff.Second bs : parts)
377+
| length as == length bs = zipWith diff as bs <> loop parts
378+
loop (part : parts) =
379+
diffPart part <> loop parts
380+
373381
diffPart part =
374382
case part of
375383
-- Only present in left

dhall/tests/diff/insideList.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
[ …
2+
, { y = - 4
3+
+ 5
4+
, …
5+
}
6+
]
7+

dhall/tests/diff/insideListA.dhall

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[ { x = 1, y = 2 }
2+
, { x = 3, y = 4 }
3+
]

dhall/tests/diff/insideListB.dhall

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[ { x = 1, y = 2 }
2+
, { x = 3, y = 5 }
3+
]

0 commit comments

Comments
 (0)