{-# OPTIONS_GHC -Wno-orphans #-}
{-# LANGUAGE EmptyCase #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeOperators #-}
module Generic.Data.Orphans where
import Data.Functor.Classes
import Data.Orphans ()
import Data.Semigroup
import GHC.Generics
instance Eq1 V1 where
liftEq _ v _ = case v of {}
instance Ord1 V1 where
liftCompare _ v _ = case v of {}
instance Eq1 U1 where
liftEq _ _ _ = True
instance Ord1 U1 where
liftCompare _ _ _ = EQ
instance Eq c => Eq1 (K1 i c) where
liftEq _ (K1 x1) (K1 x2) = x1 == x2
instance Ord c => Ord1 (K1 i c) where
liftCompare _ (K1 x1) (K1 x2) = compare x1 x2
deriving instance Eq1 f => Eq1 (M1 i c f)
deriving instance Ord1 f => Ord1 (M1 i c f)
instance (Eq1 f, Eq1 g) => Eq1 (f :*: g) where
liftEq (==.) (x1 :*: y1) (x2 :*: y2) = liftEq (==.) x1 x2 && liftEq (==.) y1 y2
instance (Ord1 f, Ord1 g) => Ord1 (f :*: g) where
liftCompare compare' (x1 :*: y1) (x2 :*: y2) =
liftCompare compare' x1 x2 <> liftCompare compare' y1 y2
instance (Eq1 f, Eq1 g) => Eq1 (f :+: g) where
liftEq (==.) (L1 x1) (L1 x2) = liftEq (==.) x1 x2
liftEq (==.) (R1 y1) (R1 y2) = liftEq (==.) y1 y2
liftEq _ _ _ = False
instance (Ord1 f, Ord1 g) => Ord1 (f :+: g) where
liftCompare compare' (L1 x1) (L1 x2) = liftCompare compare' x1 x2
liftCompare compare' (R1 y1) (R1 y2) = liftCompare compare' y1 y2
liftCompare _ (L1 _) (R1 _) = LT
liftCompare _ (R1 _) (L1 _) = GT
instance Eq1 f => Eq1 (Rec1 f) where
liftEq (==.) (Rec1 r1) (Rec1 r2) = liftEq (==.) r1 r2
instance Ord1 f => Ord1 (Rec1 f) where
liftCompare compare' (Rec1 r1) (Rec1 r2) = liftCompare compare' r1 r2
instance Eq1 Par1 where
liftEq (==.) (Par1 p1) (Par1 p2) = p1 ==. p2
instance Ord1 Par1 where
liftCompare compare' (Par1 p1) (Par1 p2) = compare' p1 p2
instance (Eq1 f, Eq1 g) => Eq1 (f :.: g) where
liftEq (==.) (Comp1 x1) (Comp1 x2) = (liftEq . liftEq) (==.) x1 x2
instance (Ord1 f, Ord1 g) => Ord1 (f :.: g) where
liftCompare compare' (Comp1 x1) (Comp1 x2) =
(liftCompare . liftCompare) compare' x1 x2