{-# LANGUAGE DerivingStrategies   #-}
{-# LANGUAGE TypeOperators        #-}
{-# LANGUAGE UndecidableInstances #-}

{-# OPTIONS_GHC -Wno-orphans #-}

module ZkFold.Base.Data.Orphans where

import           Control.DeepSeq  (NFData, NFData1)
import           Data.Binary      (Binary)
import           Data.Eq          (Eq)
import           Data.Functor     (Functor)
import           Data.Functor.Rep (Representable (..), WrappedRep (..))
import           Data.Ord         (Ord)
import           GHC.Generics     (Par1, U1, (:*:), (:.:))

instance NFData1 U1
instance NFData1 Par1
instance NFData a => NFData (Par1 a)
instance (NFData1 f, NFData1 g) => NFData1 (f :*: g)
instance (Functor f, NFData1 f, NFData1 g) => NFData1 (f :.: g)

deriving newtype instance Binary (Rep f) => Binary (WrappedRep f)
deriving newtype instance NFData (Rep f) => NFData (WrappedRep f)
deriving instance Eq (Rep f) => Eq (WrappedRep f)
deriving instance Ord (Rep f) => Ord (WrappedRep f)