@@ -9,7 +9,6 @@ import qualified Language.Haskell.TH as TH
10import Data.Proxy
10import Data.Proxy
11import Data.Functor.Identity
11import Data.Functor.Identity
12−import Control.Ether.Core
13import Control.Monad.Ether.Reader
12import Control.Monad.Ether.Reader
15emptyDataDecl :: TH.Name -> TH.DecQ
14emptyDataDecl :: TH.Name -> TH.DecQ
@@ -25,11 +24,10 @@ tyVar name = do
25 return (TH.PlainTV thName, thType)
24 return (TH.PlainTV thName, thType)
27data EtherealConfig
26data EtherealConfig
28− = EtherealReaderConfig TH.Name String String String String String
27+ = EtherealReaderConfig String String String String String
30−defaultEtherealReaderConfig :: TH.Name -> String -> EtherealConfig
29+defaultEtherealReaderConfig :: String -> EtherealConfig
31−defaultEtherealReaderConfig tyname name = EtherealReaderConfig
30+defaultEtherealReaderConfig name = EtherealReaderConfig
33 ("Monad" ++ name)
31 ("Monad" ++ name)
34 ("Tag" ++ name)
32 ("Tag" ++ name)
35 ("run" ++ name ++ "T")
33 ("run" ++ name ++ "T")
@@ -39,8 +37,7 @@ defaultEtherealReaderConfig tyname name = EtherealReaderConfig
39ethereal :: EtherealConfig -> TH.DecsQ
37ethereal :: EtherealConfig -> TH.DecsQ
41ethereal (EtherealReaderConfig
39ethereal (EtherealReaderConfig
43− strTagName strRunTransName
40+ strEffName strTagName strRunTransName
44 strRunName strAskName) = do
41 strRunName strAskName) = do
45 let effName = TH.mkName strEffName
42 let effName = TH.mkName strEffName
46 tagName = TH.mkName strTagName
43 tagName = TH.mkName strTagName
@@ -50,32 +47,34 @@ ethereal (EtherealReaderConfig
50 askName = TH.mkName strAskName
47 askName = TH.mkName strAskName
51 effDecl <- TH.tySynD effName [] [t| MonadEtherReader $tag |]
48 effDecl <- TH.tySynD effName [] [t| MonadEtherReader $tag |]
52 tagDecl <- emptyDataDecl tagName
49 tagDecl <- emptyDataDecl tagName
53− [tagInst] <- [d| type instance EtherData $tag = $(TH.conT tyname) |]
54 runTransFunSig <- do
50 runTransFunSig <- do
55 (mBndr, m) <- tyVar "m"
51 (mBndr, m) <- tyVar "m"
56 (aBndr, a) <- tyVar "a"
52 (aBndr, a) <- tyVar "a"
53+ (rBndr, r) <- tyVar "r"
57 TH.sigD runTransName
54 TH.sigD runTransName
58− $ TH.forallT [mBndr, aBndr] (return [])
55+ $ TH.forallT [mBndr, aBndr, rBndr] (return [])
59− [t| EtherReaderT $tag $m $a -> EtherData $tag -> $m $a |]
56+ [t| EtherReaderT $tag $r $m $a -> $r -> $m $a |]
60 runTransFunBody <- funSimple runTransName
57 runTransFunBody <- funSimple runTransName
61 [e| runEtherReaderT (Proxy :: Proxy $tag) |]
58 [e| runEtherReaderT (Proxy :: Proxy $tag) |]
62 runFunSig <- do
59 runFunSig <- do
63 (aBndr, a) <- tyVar "a"
60 (aBndr, a) <- tyVar "a"
61+ (rBndr, r) <- tyVar "r"
64 TH.sigD runName
62 TH.sigD runName
65− $ TH.forallT [aBndr] (return [])
63+ $ TH.forallT [aBndr, rBndr] (return [])
66− [t| EtherReaderT $tag Identity $a -> EtherData $tag -> $a |]
64+ [t| EtherReaderT $tag $r Identity $a -> $r -> $a |]
67 runFunBody <- funSimple runName
65 runFunBody <- funSimple runName
68 [e| ((runIdentity.).) $(TH.varE runTransName) |]
66 [e| ((runIdentity.).) $(TH.varE runTransName) |]
69 askFunSig <- do
67 askFunSig <- do
70 (mBndr, m) <- tyVar "m"
68 (mBndr, m) <- tyVar "m"
69+ (rBndr, r) <- tyVar "m"
71 TH.sigD askName
70 TH.sigD askName
72− $ TH.forallT [mBndr]
71+ $ TH.forallT [mBndr, rBndr]
73− (sequence [ [t| MonadEtherReader $tag $m |] ])
72+ (sequence [ [t| MonadEtherReader $tag $r $m |] ])
74− [t| $m (EtherData $tag) |]
73+ [t| $m $r |]
75 askFunBody <-
74 askFunBody <-
76 let body = [e| etherAsk (Proxy :: Proxy $tag) |]
75 let body = [e| etherAsk (Proxy :: Proxy $tag) |]
77 in TH.funD askName [ TH.clause [] (TH.normalB body) [] ]
76 in TH.funD askName [ TH.clause [] (TH.normalB body) [] ]
78− return [ effDecl, tagDecl, tagInst
77+ return [ effDecl, tagDecl
79 , runTransFunSig, runTransFunBody
78 , runTransFunSig, runTransFunBody
80 , runFunSig, runFunBody
79 , runFunSig, runFunBody
81 , askFunSig, askFunBody ]
80 , askFunSig, askFunBody ]