-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Manage multiple turned-based sessions -- -- Manage multiple turned-based sessions @package turn-loop @version 0.1.0 module TurnLoop.Types type Many rep a = (rep -> a) data Step state terminal Step :: state -> Maybe terminal -> Step state terminal [sState] :: Step state terminal -> state [sTerminal] :: Step state terminal -> Maybe terminal data Result sessionId rep userId state extra Result :: Starter sessionId rep userId -> state -> extra -> Result sessionId rep userId state extra [rStarter] :: Result sessionId rep userId state extra -> Starter sessionId rep userId [rState] :: Result sessionId rep userId state extra -> state [rExtra] :: Result sessionId rep userId state extra -> extra data Starter sessionId rep userId Starter :: sessionId -> Many rep userId -> Starter sessionId rep userId [sSessionId] :: Starter sessionId rep userId -> sessionId [sUserIds] :: Starter sessionId rep userId -> Many rep userId data Registry userId user m Registry :: (user -> m userId) -> (userId -> m (Maybe user)) -> Registry userId user m [rInsertUser] :: Registry userId user m -> user -> m userId [rGetUserById] :: Registry userId user m -> userId -> m (Maybe user) data Lobby sessionId rep userId m Lobby :: (userId -> m (Maybe (Starter sessionId rep userId))) -> (sessionId -> m (Maybe userId)) -> (Starter sessionId rep userId -> m ()) -> Lobby sessionId rep userId m [lTransferUser] :: Lobby sessionId rep userId m -> userId -> m (Maybe (Starter sessionId rep userId)) [lDequeueUser] :: Lobby sessionId rep userId m -> sessionId -> m (Maybe userId) [lAnnounceSession] :: Lobby sessionId rep userId m -> Starter sessionId rep userId -> m () data SessionEntry rep input state terminal m SessionEntry :: Thread m -> Many rep (Session input state terminal) -> SessionEntry rep input state terminal m [seThread] :: SessionEntry rep input state terminal m -> Thread m [seGames] :: SessionEntry rep input state terminal m -> Many rep (Session input state terminal) data Session input state terminal Session :: Chan input -> Chan (Step state terminal) -> Session input state terminal [sInput] :: Session input state terminal -> Chan input [sStep] :: Session input state terminal -> Chan (Step state terminal) data SessionRecord userId rep input state terminal m SessionRecord :: Thread m -> Many rep (LabeledSession userId input state terminal) -> SessionRecord userId rep input state terminal m [srThread] :: SessionRecord userId rep input state terminal m -> Thread m [srLabeled] :: SessionRecord userId rep input state terminal m -> Many rep (LabeledSession userId input state terminal) data LabeledSession userId input state terminal LabeledSession :: userId -> Session input state terminal -> LabeledSession userId input state terminal [lsUserId] :: LabeledSession userId input state terminal -> userId [lsSession] :: LabeledSession userId input state terminal -> Session input state terminal data Sessions sessionId userId rep input state terminal m Sessions :: ((sessionId, SessionRecord userId rep input state terminal m) -> m ()) -> (sessionId -> m (Maybe (SessionRecord userId rep input state terminal m))) -> (sessionId -> m ()) -> Sessions sessionId userId rep input state terminal m [sInsertSession] :: Sessions sessionId userId rep input state terminal m -> (sessionId, SessionRecord userId rep input state terminal m) -> m () [sFindSession] :: Sessions sessionId userId rep input state terminal m -> sessionId -> m (Maybe (SessionRecord userId rep input state terminal m)) [sRemoveSession] :: Sessions sessionId userId rep input state terminal m -> sessionId -> m () data Results sessionId rep userId state extra m Results :: (Result sessionId rep userId state extra -> m ()) -> (sessionId -> m (Maybe (Result sessionId rep userId state extra))) -> Results sessionId rep userId state extra m [rSaveResult] :: Results sessionId rep userId state extra m -> Result sessionId rep userId state extra -> m () [rFindResult] :: Results sessionId rep userId state extra m -> sessionId -> m (Maybe (Result sessionId rep userId state extra)) data Thread m Thread :: ThreadId -> m () -> Thread m [tThreadId] :: Thread m -> ThreadId [tKill] :: Thread m -> m () data Components sessionId rep userId user input state extra terminal m Components :: Lobby sessionId rep userId m -> Sessions sessionId userId rep input state terminal m -> Registry userId user m -> Results sessionId rep userId state extra m -> Components sessionId rep userId user input state extra terminal m [cLobby] :: Components sessionId rep userId user input state extra terminal m -> Lobby sessionId rep userId m [cSessions] :: Components sessionId rep userId user input state extra terminal m -> Sessions sessionId userId rep input state terminal m [cRegistry] :: Components sessionId rep userId user input state extra terminal m -> Registry userId user m [cResults] :: Components sessionId rep userId user input state extra terminal m -> Results sessionId rep userId state extra m instance (GHC.Classes.Eq terminal, GHC.Classes.Eq state) => GHC.Classes.Eq (TurnLoop.Types.Step state terminal) instance (GHC.Show.Show terminal, GHC.Show.Show state) => GHC.Show.Show (TurnLoop.Types.Step state terminal) module TurnLoop.STM newSessionWithChan :: MonadIO m => m (Session input state terminal) type UserQueue sessionId rep userId = [(userId, MVar (Starter sessionId rep userId))] type AnnounceDeck sessionId rep userId = Map sessionId [MVar (Starter sessionId rep userId)] newLobbyFIFOWithSTM :: (MonadIO m, Ord sessionId) => m (Lobby sessionId rep userId m) newSessionsWithSTM :: (MonadIO m, Ord sessionId) => m (Sessions sessionId userId rep input state terminal m) newRegistryWithSTM :: (MonadIO m, Ord userId) => m userId -> m (Registry userId user m) newResultsWithSTM :: (MonadIO m, Ord sessionId) => m (Results sessionId rep userId state extra m) newComponentsWithSTM :: (MonadIO m, Ord userId, Ord sessionId) => m userId -> m (Components sessionId rep userId user input state extra terminal m)