{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TupleSections #-}
module Grisette.Internal.TH.Derivation.DeriveEq
( deriveEq,
deriveEq1,
deriveEq2,
)
where
import Data.Functor.Classes (Eq1 (liftEq), Eq2 (liftEq2))
import Grisette.Internal.TH.Derivation.BinaryOpCommon
( BinaryOpClassConfig
( BinaryOpClassConfig,
binaryOpAllowSumType,
binaryOpFieldConfigs,
binaryOpInstanceNames
),
BinaryOpFieldConfig
( BinaryOpFieldConfig,
extraPatNames,
fieldCombineFun,
fieldDifferentExistentialFun,
fieldFunExp,
fieldFunNames,
fieldLMatchResult,
fieldRMatchResult,
fieldResFun
),
binaryOpAllowExistential,
defaultFieldFunExp,
genBinaryOpClass,
)
import Grisette.Internal.TH.Derivation.Common (DeriveConfig)
import Language.Haskell.TH (Dec, Exp (ListE), Q)
import Language.Haskell.TH.Syntax (Name)
eqConfig :: BinaryOpClassConfig
eqConfig :: BinaryOpClassConfig
eqConfig =
BinaryOpClassConfig
{ binaryOpFieldConfigs :: [BinaryOpFieldConfig]
binaryOpFieldConfigs =
[ BinaryOpFieldConfig
{ extraPatNames :: [String]
extraPatNames = [],
fieldResFun :: [Exp] -> (Exp, Exp) -> Exp -> Q (Exp, [Bool])
fieldResFun = \[Exp]
_ (Exp
lhs, Exp
rhs) Exp
f ->
(,[]) (Exp -> (Exp, [Bool])) -> Q Exp -> Q (Exp, [Bool])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [|$(Exp -> Q Exp
forall a. a -> Q a
forall (m :: * -> *) a. Monad m => a -> m a
return Exp
f) $(Exp -> Q Exp
forall a. a -> Q a
forall (m :: * -> *) a. Monad m => a -> m a
return Exp
lhs) $(Exp -> Q Exp
forall a. a -> Q a
forall (m :: * -> *) a. Monad m => a -> m a
return Exp
rhs)|],
fieldCombineFun :: Name -> [Exp] -> Q (Exp, [Bool])
fieldCombineFun = \Name
_ [Exp]
lst ->
(,[]) (Exp -> (Exp, [Bool])) -> Q Exp -> Q (Exp, [Bool])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [|and $(Exp -> Q Exp
forall a. a -> Q a
forall (m :: * -> *) a. Monad m => a -> m a
return (Exp -> Q Exp) -> Exp -> Q Exp
forall a b. (a -> b) -> a -> b
$ [Exp] -> Exp
ListE [Exp]
lst)|],
fieldDifferentExistentialFun :: Exp -> Q Exp
fieldDifferentExistentialFun = Q Exp -> Exp -> Q Exp
forall a b. a -> b -> a
const [|False|],
fieldFunExp :: FieldFunExp
fieldFunExp = [Name] -> FieldFunExp
defaultFieldFunExp ['(==), 'liftEq, 'liftEq2],
fieldFunNames :: [Name]
fieldFunNames = ['(==), 'liftEq, 'liftEq2],
fieldLMatchResult :: Q Exp
fieldLMatchResult = [|False|],
fieldRMatchResult :: Q Exp
fieldRMatchResult = [|False|]
}
],
binaryOpInstanceNames :: [Name]
binaryOpInstanceNames = [''Eq, ''Eq1, ''Eq2],
binaryOpAllowSumType :: Bool
binaryOpAllowSumType = Bool
True,
binaryOpAllowExistential :: Bool
binaryOpAllowExistential = Bool
True
}
deriveEq :: DeriveConfig -> Name -> Q [Dec]
deriveEq :: DeriveConfig -> Name -> Q [Dec]
deriveEq DeriveConfig
deriveConfig = DeriveConfig -> BinaryOpClassConfig -> Int -> Name -> Q [Dec]
genBinaryOpClass DeriveConfig
deriveConfig BinaryOpClassConfig
eqConfig Int
0
deriveEq1 :: DeriveConfig -> Name -> Q [Dec]
deriveEq1 :: DeriveConfig -> Name -> Q [Dec]
deriveEq1 DeriveConfig
deriveConfig = DeriveConfig -> BinaryOpClassConfig -> Int -> Name -> Q [Dec]
genBinaryOpClass DeriveConfig
deriveConfig BinaryOpClassConfig
eqConfig Int
1
deriveEq2 :: DeriveConfig -> Name -> Q [Dec]
deriveEq2 :: DeriveConfig -> Name -> Q [Dec]
deriveEq2 DeriveConfig
deriveConfig = DeriveConfig -> BinaryOpClassConfig -> Int -> Name -> Q [Dec]
genBinaryOpClass DeriveConfig
deriveConfig BinaryOpClassConfig
eqConfig Int
2