@@ -24,7 +24,7 @@ tyVar name = do
2424 return (TH.PlainTV thName, thType)
2525
2626data EtherealConfig
27− = EtherealReaderConfig String String String String String
27+ = EtherealReaderConfig String String String String String String
2828
2929defaultEtherealReaderConfig :: String -> EtherealConfig
3030defaultEtherealReaderConfig name = EtherealReaderConfig
@@ -33,18 +33,20 @@ defaultEtherealReaderConfig name = EtherealReaderConfig
3333 ("run" ++ name ++ "T")
3434 ("run" ++ name)
3535 ("ask" ++ name)
36+ ("local" ++ name)
3637
3738ethereal :: EtherealConfig -> TH.DecsQ
3839
3940ethereal (EtherealReaderConfig
4041 strEffName strTagName strRunTransName
41− strRunName strAskName) = do
42+ strRunName strAskName strLocalName) = do
4243 let effName = TH.mkName strEffName
4344 tagName = TH.mkName strTagName
4445 tag = TH.conT tagName
4546 runTransName = TH.mkName strRunTransName
4647 runName = TH.mkName strRunName
4748 askName = TH.mkName strAskName
49+ localName = TH.mkName strLocalName
4850 effDecl <- TH.tySynD effName [] [t| MonadEtherReader $tag |]
4951 tagDecl <- emptyDataDecl tagName
5052 runTransFunSig <- do
@@ -66,15 +68,23 @@ ethereal (EtherealReaderConfig
6668 [e| ((runIdentity.).) $(TH.varE runTransName) |]
6769 askFunSig <- do
6870 (mBndr, m) <- tyVar "m"
69− (rBndr, r) <- tyVar "m"
71+ (rBndr, r) <- tyVar "r"
7072 TH.sigD askName
7173 $ TH.forallT [mBndr, rBndr]
7274 (sequence [ [t| MonadEtherReader $tag $r $m |] ])
7375 [t| $m $r |]
74− askFunBody <-
75− let body = [e| etherAsk (Proxy :: Proxy $tag) |]
76− in TH.funD askName [ TH.clause [] (TH.normalB body) [] ]
76+ askFunBody <- funSimple askName [e| etherAsk (Proxy :: Proxy $tag) |]
77+ localFunSig <- do
78+ (mBndr, m) <- tyVar "m"
79+ (aBndr, a) <- tyVar "a"
80+ (rBndr, r) <- tyVar "r"
81+ TH.sigD localName
82+ $ TH.forallT [mBndr, aBndr, rBndr]
83+ (sequence [ [t| MonadEtherReader $tag $r $m |] ])
84+ [t| ($r -> $r) -> $m $a -> $m $a |]
85+ localFunBody <- funSimple localName [e| etherLocal (Proxy :: Proxy $tag) |]
7786 return [ effDecl, tagDecl
7887 , runTransFunSig, runTransFunBody
7988 , runFunSig, runFunBody
80− , askFunSig, askFunBody ]
89+ , askFunSig, askFunBody
90+ , localFunSig, localFunBody ]