module Data.Effect.Class.TH where
import Control.Monad ((<=<))
import Data.Effect.Class.TH.Internal (
EffectOrder (FirstOrder, HigherOrder),
defaultEffectDataNamer,
generateEffectDataByEffInfo,
generateLiftInsPatternSynonyms,
reifyEffectInfo,
)
import Data.List qualified as L
import Language.Haskell.TH (mkName)
import Language.Haskell.TH.Syntax (Dec, Name, Q, nameBase)
makeEffectDataWith ::
EffectOrder ->
String ->
Name ->
Q [Dec]
makeEffectDataWith :: EffectOrder -> String -> Name -> Q [Dec]
makeEffectDataWith EffectOrder
order String
effDataName Name
effClsName =
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a. a -> [a]
L.singleton forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> b
snd)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. EffectOrder -> Name -> EffectInfo -> Q (DataInfo (), Dec)
generateEffectDataByEffInfo EffectOrder
order (String -> Name
mkName String
effDataName)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Name -> Q EffectInfo
reifyEffectInfo Name
effClsName
makeInstructionWith :: String -> Name -> Q [Dec]
makeInstructionWith :: String -> Name -> Q [Dec]
makeInstructionWith = EffectOrder -> String -> Name -> Q [Dec]
makeEffectDataWith EffectOrder
FirstOrder
makeSignatureWith :: String -> Name -> Q [Dec]
makeSignatureWith :: String -> Name -> Q [Dec]
makeSignatureWith = EffectOrder -> String -> Name -> Q [Dec]
makeEffectDataWith EffectOrder
HigherOrder
makeEffectData :: EffectOrder -> Name -> Q [Dec]
makeEffectData :: EffectOrder -> Name -> Q [Dec]
makeEffectData EffectOrder
order Name
effClsName =
EffectOrder -> String -> Name -> Q [Dec]
makeEffectDataWith
EffectOrder
order
(EffectOrder -> String -> String
defaultEffectDataNamer EffectOrder
order forall a b. (a -> b) -> a -> b
$ Name -> String
nameBase Name
effClsName)
Name
effClsName
makeInstruction :: Name -> Q [Dec]
makeInstruction :: Name -> Q [Dec]
makeInstruction = EffectOrder -> Name -> Q [Dec]
makeEffectData EffectOrder
FirstOrder
makeSignature :: Name -> Q [Dec]
makeSignature :: Name -> Q [Dec]
makeSignature = EffectOrder -> Name -> Q [Dec]
makeEffectData EffectOrder
HigherOrder
makeLiftInsPatternSynonyms :: Name -> Name -> Q [Dec]
makeLiftInsPatternSynonyms :: Name -> Name -> Q [Dec]
makeLiftInsPatternSynonyms Name
dataName = Name -> EffectInfo -> Q [Dec]
generateLiftInsPatternSynonyms Name
dataName forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< Name -> Q EffectInfo
reifyEffectInfo