module Skeletest.Internal.Utils.Diff (
  showLineDiff,
) where

import Data.Algorithm.DiffContext (getContextDiff, prettyContextDiff)
import Data.Algorithm.DiffContext qualified as Diff
import Data.Text (Text)
import Data.Text qualified as Text
import Text.PrettyPrint qualified as PP

showLineDiff :: (Text, Text) -> (Text, Text) -> Text
showLineDiff :: (Text, Text) -> (Text, Text) -> Text
showLineDiff (Text
fromName, Text
fromContent) (Text
toName, Text
toContent) =
  String -> Text
Text.pack (String -> Text) -> (Doc -> String) -> Doc -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc -> String
PP.render (Doc -> Text) -> Doc -> Text
forall a b. (a -> b) -> a -> b
$
    Doc
-> Doc
-> (Numbered Text -> Doc)
-> ContextDiff (Numbered Text)
-> Doc
forall c.
Doc
-> Doc -> (Numbered c -> Doc) -> ContextDiff (Numbered c) -> Doc
prettyContextDiff (Text -> Doc
ppText Text
fromName) (Text -> Doc
ppText Text
toName) (Text -> Doc
ppText (Text -> Doc) -> (Numbered Text -> Text) -> Numbered Text -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Numbered Text -> Text
forall a. Numbered a -> a
Diff.unnumber) (ContextDiff (Numbered Text) -> Doc)
-> ContextDiff (Numbered Text) -> Doc
forall a b. (a -> b) -> a -> b
$
      Maybe Int -> [Text] -> [Text] -> ContextDiff (Numbered Text)
forall a.
Eq a =>
Maybe Int -> [a] -> [a] -> ContextDiff (Numbered a)
getContextDiff (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
5) (Text -> [Text]
Text.lines Text
fromContent) (Text -> [Text]
Text.lines Text
toContent)
  where
    ppText :: Text -> Doc
ppText = String -> Doc
PP.text (String -> Doc) -> (Text -> String) -> Text -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
Text.unpack