on master help sign in
Added ability for generic CGIT monads.

Thanks for the recommendation from Peter Robinson.

commit6ce45d1a2b091076a324631e7f5e15b43ca08c1b authorMichael Snoyman <michael@snoyman.com> dateThu 30 Jul 2009, 15:40 (17 years ago) parent56e906e
3 files changed+29−4
Hack/Frontend/MonadCGI.hs+10−3 hack-frontend-monadcgi.cabal+1−1 samples/hack_cgi_generic.hs+18
Hack/Frontend/MonadCGI.hs+10−3
@@ -1,5 +1,6 @@
11module Hack.Frontend.MonadCGI
22 ( cgiToApp
3+ , cgiToAppGeneric
34 ) where
45
56import Hack
@@ -18,16 +19,22 @@ safeRead d s = case reads s of
1819 _ -> d
1920
2021cgiToApp :: CGI CGIResult -> Application
21−cgiToApp cgi env = do
22+cgiToApp = cgiToAppGeneric id
23+
24+cgiToAppGeneric :: Monad m
25+ => (m (Headers, CGIResult) -> IO (Headers, CGIResult))
26+ -> CGIT m CGIResult
27+ -> Application
28+cgiToAppGeneric toIO cgi env = do
2229 let vars = map (first fixVarName) (http env)++ getCgiVars env
2330 input = hackInput env
2431 (inputs, body') = decodeInput vars input
2532 req = CGIRequest
2633 { cgiVars = Map.fromList $ vars
27− , cgiInputs = inputs
34+ , cgiInputs = inputs
2835 , cgiRequestBody = body'
2936 }
30− (headers'', output') <- runCGIT cgi req
37+ (headers'', output') <- toIO $ runCGIT cgi req
3138 let output = case output' of
3239 CGIOutput bs -> bs
3340 CGINothing -> BS.empty
hack-frontend-monadcgi.cabal+1−1
@@ -1,5 +1,5 @@
11name: hack-frontend-monadcgi
2−version: 0.0.2
2+version: 0.0.3
33license: BSD3
44license-file: LICENSE
55author: Michael Snoyman <michael@snoyman.com>
samples/hack_cgi_generic.hsnew file+18
@@ -0,0 +1,18 @@
1+import qualified Network.CGI
2+import qualified Hack.Handler.CGI
3+import qualified Hack.Frontend.MonadCGI
4+import Control.Monad.Reader
5+
6+main :: IO ()
7+main = Hack.Handler.CGI.run
8+ $ Hack.Frontend.MonadCGI.cgiToAppGeneric
9+ monadToIO
10+ mainCGI
11+
12+mainCGI :: Network.CGI.CGIT (Reader String) Network.CGI.CGIResult
13+mainCGI = do
14+ s <- lift ask
15+ Network.CGI.output s
16+
17+monadToIO :: Reader String a -> IO a
18+monadToIO = return . (flip runReader) "This is a generic test"