module Data.Algorithm.Diff.Refinement where
import Data.Algorithm.Diff.Type
validListDiff :: PolyDiff [a] [b] -> Bool
validListDiff :: forall a b. PolyDiff [a] [b] -> Bool
validListDiff (Both [a]
xs [b]
ys) = [a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
xs Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== [b] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [b]
ys
validListDiff (First [a]
_) = Bool
True
validListDiff (Second [b]
_) = Bool
True
nonEmptyDiff :: PolyDiff [a] [b] -> Bool
nonEmptyDiff :: forall a b. PolyDiff [a] [b] -> Bool
nonEmptyDiff (First []) = Bool
False
nonEmptyDiff (Second []) = Bool
False
nonEmptyDiff (Both [] [b]
_) = Bool
False
nonEmptyDiff (Both [a]
_ []) = Bool
False
nonEmptyDiff PolyDiff [a] [b]
_ = Bool
True
headIsFirst, headIsSecond, headIsBoth :: [PolyDiff a b] -> Bool
headIsFirst :: forall a b. [PolyDiff a b] -> Bool
headIsFirst (First a
_ : [PolyDiff a b]
_) = Bool
True
headIsFirst [PolyDiff a b]
_ = Bool
False
headIsSecond :: forall a b. [PolyDiff a b] -> Bool
headIsSecond (Second b
_ : [PolyDiff a b]
_) = Bool
True
headIsSecond [PolyDiff a b]
_ = Bool
False
headIsBoth :: forall a b. [PolyDiff a b] -> Bool
headIsBoth (Both a
_ b
_ : [PolyDiff a b]
_) = Bool
True
headIsBoth [PolyDiff a b]
_ = Bool
False
noStuttering :: [PolyDiff a b] -> Bool
noStuttering :: forall a b. [PolyDiff a b] -> Bool
noStuttering [] = Bool
True
noStuttering (First a
_ : [PolyDiff a b]
xs) = Bool -> Bool
not ([PolyDiff a b] -> Bool
forall a b. [PolyDiff a b] -> Bool
headIsFirst [PolyDiff a b]
xs) Bool -> Bool -> Bool
&& [PolyDiff a b] -> Bool
forall a b. [PolyDiff a b] -> Bool
noStuttering [PolyDiff a b]
xs
noStuttering (Second b
_ : [PolyDiff a b]
xs) = Bool -> Bool
not ([PolyDiff a b] -> Bool
forall a b. [PolyDiff a b] -> Bool
headIsSecond [PolyDiff a b]
xs) Bool -> Bool -> Bool
&& [PolyDiff a b] -> Bool
forall a b. [PolyDiff a b] -> Bool
noStuttering [PolyDiff a b]
xs
noStuttering (Both a
_ b
_ : [PolyDiff a b]
xs) = Bool -> Bool
not ([PolyDiff a b] -> Bool
forall a b. [PolyDiff a b] -> Bool
headIsBoth [PolyDiff a b]
xs) Bool -> Bool -> Bool
&& [PolyDiff a b] -> Bool
forall a b. [PolyDiff a b] -> Bool
noStuttering [PolyDiff a b]
xs
noFFSS :: [PolyDiff a b] -> Bool
noFFSS :: forall a b. [PolyDiff a b] -> Bool
noFFSS [] = Bool
True
noFFSS (First a
_ : [PolyDiff a b]
xs) = Bool -> Bool
not ([PolyDiff a b] -> Bool
forall a b. [PolyDiff a b] -> Bool
headIsFirst [PolyDiff a b]
xs) Bool -> Bool -> Bool
&& [PolyDiff a b] -> Bool
forall a b. [PolyDiff a b] -> Bool
noFFSS [PolyDiff a b]
xs
noFFSS (Second b
_ : [PolyDiff a b]
xs) = Bool -> Bool
not ([PolyDiff a b] -> Bool
forall a b. [PolyDiff a b] -> Bool
headIsSecond [PolyDiff a b]
xs) Bool -> Bool -> Bool
&& [PolyDiff a b] -> Bool
forall a b. [PolyDiff a b] -> Bool
noFFSS [PolyDiff a b]
xs
noFFSS (Both a
_ b
_ : [PolyDiff a b]
xs) = [PolyDiff a b] -> Bool
forall a b. [PolyDiff a b] -> Bool
noFFSS [PolyDiff a b]
xs
fst3 :: (a, b, c) -> a
fst3 :: forall a b c. (a, b, c) -> a
fst3 (a
x, b
_, c
_) = a
x
snd3 :: (a, b, c) -> b
snd3 :: forall a b c. (a, b, c) -> b
snd3 (a
_, b
y, c
_) = b
y
thd3 :: (a, b, c) -> c
thd3 :: forall a b c. (a, b, c) -> c
thd3 (a
_, b
_, c
z) = c
z