@@ -24,7 +24,7 @@ tyVar name = do
24 return (TH.PlainTV thName, thType)
24 return (TH.PlainTV thName, thType)
26data EtherealConfig
26data EtherealConfig
27− = EtherealReaderConfig String String String String String
27+ = EtherealReaderConfig String String String String String String
29defaultEtherealReaderConfig :: String -> EtherealConfig
29defaultEtherealReaderConfig :: String -> EtherealConfig
30defaultEtherealReaderConfig name = EtherealReaderConfig
30defaultEtherealReaderConfig name = EtherealReaderConfig
@@ -33,18 +33,20 @@ defaultEtherealReaderConfig name = EtherealReaderConfig
33 ("run" ++ name ++ "T")
33 ("run" ++ name ++ "T")
34 ("run" ++ name)
34 ("run" ++ name)
35 ("ask" ++ name)
35 ("ask" ++ name)
37ethereal :: EtherealConfig -> TH.DecsQ
38ethereal :: EtherealConfig -> TH.DecsQ
39ethereal (EtherealReaderConfig
40ethereal (EtherealReaderConfig
40 strEffName strTagName strRunTransName
41 strEffName strTagName strRunTransName
41− strRunName strAskName) = do
42+ strRunName strAskName strLocalName) = do
42 let effName = TH.mkName strEffName
43 let effName = TH.mkName strEffName
43 tagName = TH.mkName strTagName
44 tagName = TH.mkName strTagName
44 tag = TH.conT tagName
45 tag = TH.conT tagName
45 runTransName = TH.mkName strRunTransName
46 runTransName = TH.mkName strRunTransName
46 runName = TH.mkName strRunName
47 runName = TH.mkName strRunName
47 askName = TH.mkName strAskName
48 askName = TH.mkName strAskName
49+ localName = TH.mkName strLocalName
48 effDecl <- TH.tySynD effName [] [t| MonadEtherReader $tag |]
50 effDecl <- TH.tySynD effName [] [t| MonadEtherReader $tag |]
49 tagDecl <- emptyDataDecl tagName
51 tagDecl <- emptyDataDecl tagName
50 runTransFunSig <- do
52 runTransFunSig <- do
@@ -66,15 +68,23 @@ ethereal (EtherealReaderConfig
66 [e| ((runIdentity.).) $(TH.varE runTransName) |]
68 [e| ((runIdentity.).) $(TH.varE runTransName) |]
67 askFunSig <- do
69 askFunSig <- do
68 (mBndr, m) <- tyVar "m"
70 (mBndr, m) <- tyVar "m"
69− (rBndr, r) <- tyVar "m"
71+ (rBndr, r) <- tyVar "r"
70 TH.sigD askName
72 TH.sigD askName
71 $ TH.forallT [mBndr, rBndr]
73 $ TH.forallT [mBndr, rBndr]
72 (sequence [ [t| MonadEtherReader $tag $r $m |] ])
74 (sequence [ [t| MonadEtherReader $tag $r $m |] ])
73 [t| $m $r |]
75 [t| $m $r |]
74− askFunBody <-
76+ askFunBody <- funSimple askName [e| etherAsk (Proxy :: Proxy $tag) |]
75− let body = [e| etherAsk (Proxy :: Proxy $tag) |]
77+ localFunSig <- do
76− in TH.funD askName [ TH.clause [] (TH.normalB body) [] ]
78+ (mBndr, m) <- tyVar "m"
79+ (aBndr, a) <- tyVar "a"
80+ (rBndr, r) <- tyVar "r"
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) |]
77 return [ effDecl, tagDecl
86 return [ effDecl, tagDecl
78 , runTransFunSig, runTransFunBody
87 , runTransFunSig, runTransFunBody
79 , runFunSig, runFunBody
88 , runFunSig, runFunBody
80− , askFunSig, askFunBody ]
89+ , askFunSig, askFunBody
90+ , localFunSig, localFunBody ]