1{-# LANGUAGE TemplateHaskell #-}
5 , defaultEtherealReaderConfig
8import qualified Language.Haskell.TH as TH
11import Data.Functor.Identity
12import Control.Monad.Ether.Reader
14emptyDataDecl :: TH.Name -> TH.DecQ
15emptyDataDecl name = TH.dataD (return []) name [] [] []
17funSimple :: TH.Name -> TH.ExpQ -> TH.DecQ
18funSimple name body = TH.funD name [ TH.clause [] (TH.normalB body) [] ]
20tyVar :: String -> TH.Q (TH.TyVarBndr, TH.TypeQ)
22 thName <- TH.newName name
23 let thType = TH.varT thName
24 return (TH.PlainTV thName, thType)
27 = EtherealReaderConfig String String String String String String
29defaultEtherealReaderConfig :: String -> EtherealConfig
30defaultEtherealReaderConfig name = EtherealReaderConfig
33 ("run" ++ name ++ "T")
38ethereal :: EtherealConfig -> TH.DecsQ
40ethereal (EtherealReaderConfig
41 strEffName strTagName strRunTransName
42 strRunName strAskName strLocalName) = do
43 let effName = TH.mkName strEffName
44 tagName = TH.mkName strTagName
46 runTransName = TH.mkName strRunTransName
47 runName = TH.mkName strRunName
48 askName = TH.mkName strAskName
49 localName = TH.mkName strLocalName
50 effDecl <- TH.tySynD effName [] [t| MonadEtherReader $tag |]
51 tagDecl <- emptyDataDecl tagName
53 (mBndr, m) <- tyVar "m"
54 (aBndr, a) <- tyVar "a"
55 (rBndr, r) <- tyVar "r"
57 $ TH.forallT [mBndr, aBndr, rBndr] (return [])
58 [t| EtherReaderT $tag $r $m $a -> $r -> $m $a |]
59 runTransFunBody <- funSimple runTransName
60 [e| runEtherReaderT (Proxy :: Proxy $tag) |]
62 (aBndr, a) <- tyVar "a"
63 (rBndr, r) <- tyVar "r"
65 $ TH.forallT [aBndr, rBndr] (return [])
66 [t| EtherReaderT $tag $r Identity $a -> $r -> $a |]
67 runFunBody <- funSimple runName
68 [e| ((runIdentity.).) $(TH.varE runTransName) |]
70 (mBndr, m) <- tyVar "m"
71 (rBndr, r) <- tyVar "r"
73 $ TH.forallT [mBndr, rBndr]
74 (sequence [ [t| MonadEtherReader $tag $r $m |] ])
76 askFunBody <- funSimple askName [e| etherAsk (Proxy :: Proxy $tag) |]
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) |]
86 return [ effDecl, tagDecl
87 , runTransFunSig, runTransFunBody
88 , runFunSig, runFunBody
89 , askFunSig, askFunBody
90 , localFunSig, localFunBody ]
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list