content: module Web.Apiary.WebSockets (
      webSockets, webSockets'
      , actionWithWebSockets 
      , actionWithWebSockets'
      , websocketsToAction
      -- * Reexport
      -- | PendingConnection,
      -- pandingRequest, acceptRequest, rejectrequest
      --
      -- receiveData
      --
      -- sendTextData, sendBinaryData, sendClose, sendPing
      , module Network.WebSockets
      ) where
  
  import Control.Monad(mzero, mplus)
  import Control.Monad.Apiary(ApiaryT, action)
  import Control.Monad.Apiary.Action(ActionT, getRequest, getParams, stopWith)
  
  import qualified Network.Routing.Dict as Dict
  import qualified Network.Wai.Handler.WebSockets as WS
  import qualified Network.WebSockets as WS
  
  import Network.WebSockets
      ( PendingConnection
      , pendingRequest, acceptRequest, rejectRequest
      , receiveData
      , sendTextData, sendBinaryData, sendClose, sendPing
      )
  
  websocketsToAction :: Monad m => WS.ConnectionOptions 
                     -> (Dict.Dict prms -> WS.ServerApp) -> ActionT exts prms m ()
  websocketsToAction conn srv = do
      req <- getRequest
      d   <- getParams
      case WS.websocketsApp conn (srv d) req of
          Nothing -> mzero
          Just r  -> stopWith r
  
  -- | websocket only action. since 0.8.0.0.
  webSockets' :: (Monad m, Monad actM) => WS.ConnectionOptions
              -> (Dict.Dict prms -> WS.ServerApp) -> ApiaryT exts prms actM m ()
  webSockets' conn srv = action $ websocketsToAction conn srv
  
  -- | websocket only action. since 0.8.0.0.
  webSockets :: (Monad m, Monad n)
             => (Dict.Dict prms -> WS.ServerApp) -> ApiaryT exts prms n m ()
  webSockets = webSockets' WS.defaultConnectionOptions
  
  actionWithWebSockets' :: (Monad m, Monad actM)
                        => WS.ConnectionOptions 
                        -> (Dict.Dict prms -> WS.ServerApp)
                        -> ActionT exts prms actM ()
                        -> ApiaryT exts prms actM m ()
  actionWithWebSockets' conn srv m =
      action $ websocketsToAction conn srv `mplus` m
  
  actionWithWebSockets :: (Monad m, Monad actM)
                       => (Dict.Dict prms -> WS.ServerApp)
                       -> ActionT exts prms actM ()
                       -> ApiaryT exts prms actM m ()
  actionWithWebSockets = actionWithWebSockets' WS.defaultConnectionOptions
  