{-# OPTIONS_GHC -Wno-orphans #-}

{- | Diffs on lists as a special case. See "Generics.Diff.Special" for a detailed explanation
of the implementation.
-}
module Generics.Diff.Special.List
  ( ListDiffError (..)
  , diffListWith
  )
where

import Data.Function (on)
import qualified Data.List.NonEmpty as NE
import Generics.Diff.Class
import Generics.Diff.Render
import Generics.Diff.Type

instance (Diff a) => SpecialDiff (NE.NonEmpty a) where
  type SpecialDiffError (NE.NonEmpty a) = ListDiffError a
  specialDiff :: NonEmpty a -> NonEmpty a -> Maybe (SpecialDiffError (NonEmpty a))
specialDiff = (a -> a -> DiffResult a) -> [a] -> [a] -> Maybe (ListDiffError a)
forall a.
(a -> a -> DiffResult a) -> [a] -> [a] -> Maybe (ListDiffError a)
diffListWith a -> a -> DiffResult a
forall a. Diff a => a -> a -> DiffResult a
diff ([a] -> [a] -> Maybe (ListDiffError a))
-> (NonEmpty a -> [a])
-> NonEmpty a
-> NonEmpty a
-> Maybe (ListDiffError a)
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` NonEmpty a -> [a]
forall a. NonEmpty a -> [a]
NE.toList
  renderSpecialDiffError :: SpecialDiffError (NonEmpty a) -> Doc
renderSpecialDiffError = Builder -> ListDiffError a -> Doc
forall a. Builder -> ListDiffError a -> Doc
listDiffErrorDoc Builder
"non-empty list"