@@ -9,7 +9,6 @@ import qualified Language.Haskell.TH as TH
99
1010import Data.Proxy
1111import Data.Functor.Identity
12−import Control.Ether.Core
1312import Control.Monad.Ether.Reader
1413
1514emptyDataDecl :: TH.Name -> TH.DecQ
@@ -25,11 +24,10 @@ tyVar name = do
2524 return (TH.PlainTV thName, thType)
2625
2726data EtherealConfig
28− = EtherealReaderConfig TH.Name String String String String String
27+ = EtherealReaderConfig String String String String String
2928
30−defaultEtherealReaderConfig :: TH.Name -> String -> EtherealConfig
31−defaultEtherealReaderConfig tyname name = EtherealReaderConfig
32− tyname
29+defaultEtherealReaderConfig :: String -> EtherealConfig
30+defaultEtherealReaderConfig name = EtherealReaderConfig
3331 ("Monad" ++ name)
3432 ("Tag" ++ name)
3533 ("run" ++ name ++ "T")
@@ -39,8 +37,7 @@ defaultEtherealReaderConfig tyname name = EtherealReaderConfig
3937ethereal :: EtherealConfig -> TH.DecsQ
4038
4139ethereal (EtherealReaderConfig
42− tyname strEffName
43− strTagName strRunTransName
40+ strEffName strTagName strRunTransName
4441 strRunName strAskName) = do
4542 let effName = TH.mkName strEffName
4643 tagName = TH.mkName strTagName
@@ -50,32 +47,34 @@ ethereal (EtherealReaderConfig
5047 askName = TH.mkName strAskName
5148 effDecl <- TH.tySynD effName [] [t| MonadEtherReader $tag |]
5249 tagDecl <- emptyDataDecl tagName
53− [tagInst] <- [d| type instance EtherData $tag = $(TH.conT tyname) |]
5450 runTransFunSig <- do
5551 (mBndr, m) <- tyVar "m"
5652 (aBndr, a) <- tyVar "a"
53+ (rBndr, r) <- tyVar "r"
5754 TH.sigD runTransName
58− $ TH.forallT [mBndr, aBndr] (return [])
59− [t| EtherReaderT $tag $m $a -> EtherData $tag -> $m $a |]
55+ $ TH.forallT [mBndr, aBndr, rBndr] (return [])
56+ [t| EtherReaderT $tag $r $m $a -> $r -> $m $a |]
6057 runTransFunBody <- funSimple runTransName
6158 [e| runEtherReaderT (Proxy :: Proxy $tag) |]
6259 runFunSig <- do
6360 (aBndr, a) <- tyVar "a"
61+ (rBndr, r) <- tyVar "r"
6462 TH.sigD runName
65− $ TH.forallT [aBndr] (return [])
66− [t| EtherReaderT $tag Identity $a -> EtherData $tag -> $a |]
63+ $ TH.forallT [aBndr, rBndr] (return [])
64+ [t| EtherReaderT $tag $r Identity $a -> $r -> $a |]
6765 runFunBody <- funSimple runName
6866 [e| ((runIdentity.).) $(TH.varE runTransName) |]
6967 askFunSig <- do
7068 (mBndr, m) <- tyVar "m"
69+ (rBndr, r) <- tyVar "m"
7170 TH.sigD askName
72− $ TH.forallT [mBndr]
73− (sequence [ [t| MonadEtherReader $tag $m |] ])
74− [t| $m (EtherData $tag) |]
71+ $ TH.forallT [mBndr, rBndr]
72+ (sequence [ [t| MonadEtherReader $tag $r $m |] ])
73+ [t| $m $r |]
7574 askFunBody <-
7675 let body = [e| etherAsk (Proxy :: Proxy $tag) |]
7776 in TH.funD askName [ TH.clause [] (TH.normalB body) [] ]
78− return [ effDecl, tagDecl, tagInst
77+ return [ effDecl, tagDecl
7978 , runTransFunSig, runTransFunBody
8079 , runFunSig, runFunBody
8180 , askFunSig, askFunBody ]