{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}
{-# HLINT ignore "Unused LANGUAGE pragma" #-}
module Grisette.Internal.TH.GADT.DeriveExtractSym
( deriveGADTExtractSym,
deriveGADTExtractSym1,
deriveGADTExtractSym2,
)
where
import Grisette.Internal.Core.Data.Class.ExtractSym
( ExtractSym (extractSymMaybe),
ExtractSym1 (liftExtractSymMaybe),
ExtractSym2 (liftExtractSymMaybe2),
)
import Grisette.Internal.TH.GADT.UnaryOpCommon
( UnaryOpClassConfig
( UnaryOpClassConfig,
unaryOpFieldConfig,
unaryOpFunNames,
unaryOpInstanceNames
),
UnaryOpFieldConfig
( UnaryOpFieldConfig,
extraPatNames,
fieldCombineFun
),
genUnaryOpClass,
)
import Language.Haskell.TH
( Dec,
Exp (AppE, ListE, VarE),
Name,
Q,
)
genExtractSym' :: Int -> Name -> Q [Dec]
Int
n Name
typName = do
UnaryOpClassConfig -> Int -> Name -> Q [Dec]
genUnaryOpClass
UnaryOpClassConfig
{ unaryOpFieldConfig :: UnaryOpFieldConfig
unaryOpFieldConfig =
UnaryOpFieldConfig
{ extraPatNames :: [String]
extraPatNames = [],
fieldCombineFun :: Exp -> [Exp] -> Q Exp
fieldCombineFun = \Exp
_ [Exp]
exp ->
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 -> Exp
AppE (Name -> Exp
VarE 'mconcat) (Exp -> Exp) -> Exp -> Exp
forall a b. (a -> b) -> a -> b
$ [Exp] -> Exp
ListE [Exp]
exp
},
unaryOpInstanceNames :: [Name]
unaryOpInstanceNames =
[''ExtractSym, ''ExtractSym1, ''ExtractSym2],
unaryOpFunNames :: [Name]
unaryOpFunNames =
['extractSymMaybe, 'liftExtractSymMaybe, 'liftExtractSymMaybe2]
}
Int
n
Name
typName
deriveGADTExtractSym :: Name -> Q [Dec]
= Int -> Name -> Q [Dec]
genExtractSym' Int
0
deriveGADTExtractSym1 :: Name -> Q [Dec]
= Int -> Name -> Q [Dec]
genExtractSym' Int
1
deriveGADTExtractSym2 :: Name -> Q [Dec]
= Int -> Name -> Q [Dec]
genExtractSym' Int
2