supervisor-0.1.1.0: Control/Monad/Supervisor/Session.hs
-----------------------------------------------------------------------------
--
-- Module : Control.Monad.Supervisor.Session
-- Copyright :
-- License : BSD3
--
-- Maintainer : agocorona@gmail.com
-- Stability :
-- Portability :
--
-- |
--
-----------------------------------------------------------------------------
{-# LANGUAGE TypeSynonymInstances,
FlexibleInstances,
MultiParamTypeClasses,
FlexibleContexts,
UndecidableInstances #-}
module Control.Monad.Supervisor.Session where
import Control.Monad.State
--import Control.Monad.Supervisor
import Data.Map as M
import Data.Typeable
import Data.Dynamic
onNothing m exc= do
r <- m
case r of
Nothing -> exc
Just r -> return r
-- | Set user-defined data in the context of the session.
--
-- The data is indexed by type in a map. So the user can insert-retrieve different kinds of data
-- in the session context to add different behaviours to the supervisor monad.
--
type SessionData= M.Map TypeRep Dynamic
emptySessionData= M.empty
setSessionData :: ( MonadState SessionData m, Typeable a) => a -> m ()
setSessionData x=
modify $ \session -> M.insert (typeOf x ) (toDyn x) session
delSessionData :: ( MonadState SessionData m, Typeable a) => a -> m ()
delSessionData x=
modify $ \session -> M.delete (typeOf x ) (session :: M.Map TypeRep Dynamic)
-- | Get the session data of the desired type if there is any.
getSessionData :: (Typeable a, MonadState SessionData m) => m (Maybe a)
getSessionData = resp where
resp= get >>= \list ->
case M.lookup ( typeOf $ typeResp resp) list :: Maybe Dynamic of
Just x -> return $ cast x
Nothing -> return Nothing
typeResp :: m (Maybe x) -> x
typeResp= undefined
runs= flip evalStateT
main= do
r <- runs emptySessionData $ do
setSessionData True
getSessionData
print (r :: Maybe Bool)