-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | Snap backend for jmacro-rpc
--   
--   Provides functions for serving jmacro-rpc json rpcs and panels from
--   Snap.
@package jmacro-rpc-snap
@version 0.3


-- | Snap backend for JMacro-RPC.
--   
--   Example usage:
--   
--   <pre>
--   module Main where
--   import Network.JMacroRPC.Snap
--   import Snap.Http.Server
--   import Snap.Core
--   import Language.Javascript.JMacro
--   import Control.Concurrent
--   import Control.Monad.Trans
--   import Network.JMacroRPC.Base
--   import Text.XHtml hiding(dir)
--   import qualified Data.Text as T
--   
--   jsScript f = script (primHtml f) ! [thetype "text/javascript"]
--   jsScript' = jsScript . show . renderJs
--   
--   testPage = mkConversationPageNoCulling pageFun (newMVar (1::Int)) jRpcs
--       where pageFun :: JStat -&gt;  Snap ()
--             pageFun js = writeText $ T.pack $ show $
--                          (header &lt;&lt; [script ! [src "https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"] &lt;&lt; noHtml]) +++
--                          jsScript' js +++
--                          jsScript' ([jmacro|$(\
--                                        {
--                                              var b = $("&lt;button&gt;click me!&lt;/button&gt;");
--                                              $("body").append(b);
--                                              b.click(\ {
--                                                  var c = getCounter();
--                                                  alert ("counter is: " + c);
--                                              });
--                                        });
--                                     |]);
--             jRpcs = [getCounterRPC]
--             getCounterRPC =
--                 toJsonConvRPC "getCounter" $ \s -&gt; (liftIO $ retRight =&lt;&lt; modifyMVar s (\i -&gt; return (i+1,i)) :: Snap (Either String Int))
--   
--   retRight :: a -&gt; IO (Either String a)
--   retRight = return . Right
--   
--   main = quickHttpServe =&lt;&lt; testPage
--   </pre>
--   
--   Every invocation of this page (including from the same browser) will
--   have a distinct, stateful, counter, stored server-side.
module Network.JMacroRPC.Snap

-- | Provide a set of json rpcs.
serveRpcs :: MonadSnap m => (Int -> m s) -> [JsonRPC m s] -> m ()

-- | This general handler allows explicit culling of conversation state.
mkConversationPage :: (MonadSnap m) => IO timestamp -> (IntMap (timestamp, s) -> IO (IntMap (timestamp, s))) -> (JStat -> m ()) -> IO s -> [JsonRPC m s] -> IO (m ())

-- | This simple handler allows conversation state to grow without bounds.
mkConversationPageNoCulling :: (MonadSnap m) => (JStat -> m ()) -> IO s -> [JsonRPC m s] -> IO (m ())

-- | Convert a Panel into a Snap resource.
panelToPage :: Maybe String -> String -> Panel Snap -> Snap ()
instance Data.Aeson.Types.ToJSON.ToJSON b => Network.JMacroRPC.Base.ToJsonRPC (Snap.Internal.Core.Snap (Data.Either.Either GHC.Base.String b)) Snap.Internal.Core.Snap
