-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | tic-tac-toe server -- -- Please see README.md @package t3-server @version 0.2.0 module T3.Match.Types newtype UserName UserName :: Text -> UserName newtype MatchId MatchId :: Text -> MatchId newtype MatchToken MatchToken :: Text -> MatchToken data Users Users :: UserName -> UserName -> Users [_uX] :: Users -> UserName [_uO] :: Users -> UserName data MatchInfo MatchInfo :: MatchId -> MatchToken -> MatchInfo [_miMatchId] :: MatchInfo -> MatchId [_miMatchToken] :: MatchInfo -> MatchToken data Step Step :: Board -> Maybe Final -> Step [_stepBoard] :: Step -> Board [_stepFinal] :: Step -> Maybe Final data Final Won :: Final WonByDQ :: Final Loss :: Final LossByDQ :: Final Tied :: Final instance GHC.Generics.Selector T3.Match.Types.S1_0_1MatchInfo instance GHC.Generics.Selector T3.Match.Types.S1_0_0MatchInfo instance GHC.Generics.Constructor T3.Match.Types.C1_0MatchInfo instance GHC.Generics.Datatype T3.Match.Types.D1MatchInfo instance GHC.Generics.Selector T3.Match.Types.S1_0_1Users instance GHC.Generics.Selector T3.Match.Types.S1_0_0Users instance GHC.Generics.Constructor T3.Match.Types.C1_0Users instance GHC.Generics.Datatype T3.Match.Types.D1Users instance GHC.Classes.Eq T3.Match.Types.Step instance GHC.Show.Show T3.Match.Types.Step instance GHC.Classes.Eq T3.Match.Types.Final instance GHC.Show.Show T3.Match.Types.Final instance GHC.Generics.Generic T3.Match.Types.MatchInfo instance GHC.Classes.Eq T3.Match.Types.MatchInfo instance GHC.Show.Show T3.Match.Types.MatchInfo instance GHC.Generics.Generic T3.Match.Types.Users instance GHC.Classes.Eq T3.Match.Types.Users instance GHC.Show.Show T3.Match.Types.Users instance Data.Aeson.Types.Class.ToJSON T3.Match.Types.MatchToken instance Data.Aeson.Types.Class.FromJSON T3.Match.Types.MatchToken instance GHC.Classes.Ord T3.Match.Types.MatchToken instance GHC.Classes.Eq T3.Match.Types.MatchToken instance GHC.Show.Show T3.Match.Types.MatchToken instance Data.Aeson.Types.Class.ToJSON T3.Match.Types.MatchId instance Data.Aeson.Types.Class.FromJSON T3.Match.Types.MatchId instance GHC.Classes.Ord T3.Match.Types.MatchId instance GHC.Classes.Eq T3.Match.Types.MatchId instance GHC.Show.Show T3.Match.Types.MatchId instance Data.Aeson.Types.Class.ToJSON T3.Match.Types.UserName instance Data.Aeson.Types.Class.FromJSON T3.Match.Types.UserName instance GHC.Classes.Ord T3.Match.Types.UserName instance GHC.Classes.Eq T3.Match.Types.UserName instance GHC.Show.Show T3.Match.Types.UserName instance Data.Aeson.Types.Class.FromJSON T3.Match.Types.Users instance Data.Aeson.Types.Class.ToJSON T3.Match.Types.Users instance Data.Aeson.Types.Class.FromJSON T3.Match.Types.MatchInfo instance Data.Aeson.Types.Class.ToJSON T3.Match.Types.MatchInfo instance Data.Aeson.Types.Class.FromJSON T3.Match.Types.Final instance Data.Aeson.Types.Class.ToJSON T3.Match.Types.Final module T3.Random randomLoc :: MonadRandom m => Board -> m (Maybe Loc) module Control.Monad.Conc.ClassTmp class Monad m => MonadConc m threadDelay :: MonadConc m => Int -> m () race :: MonadConc m => m a -> m b -> m (Either a b) fork :: MonadConc m => m () -> m ThreadId newChan :: MonadConc m => m (Chan a) readChan :: MonadConc m => Chan a -> m a writeChan :: MonadConc m => Chan a -> a -> m () killThread :: MonadConc m => ThreadId -> m () newTVarIO :: MonadConc m => a -> m (TVar a) atomically :: MonadConc m => STM a -> m a newEmptyMVar :: MonadConc m => m (MVar a) putMVar :: MonadConc m => MVar a -> a -> m () takeMVar :: MonadConc m => MVar a -> m a instance Control.Monad.Conc.ClassTmp.MonadConc GHC.Types.IO module T3.Match newtype Seconds Seconds :: Int -> Seconds runMatch :: MonadConc m => Maybe Seconds -> UserInit m -> UserInit m -> ([Action] -> Board -> Result -> m ()) -> m () -> m () type UserInit m = (Callback m, m (Loc, Callback m)) type Callback m = Step -> m () type StartCallback m = MatchInfo -> Users -> Step -> m () delay :: MonadConc m => Seconds -> m () instance GHC.Base.Monad m => Control.Monad.State.Class.MonadState (T3.Match.MatchData m) (T3.Match.MatchT m) instance GHC.Base.Monad m => GHC.Base.Monad (T3.Match.MatchT m) instance GHC.Base.Monad m => GHC.Base.Applicative (T3.Match.MatchT m) instance GHC.Base.Monad m => GHC.Base.Functor (T3.Match.MatchT m) instance GHC.Enum.Enum T3.Match.Seconds instance GHC.Classes.Ord T3.Match.Seconds instance GHC.Classes.Eq T3.Match.Seconds instance GHC.Show.Show T3.Match.Seconds instance GHC.Num.Num T3.Match.Seconds instance Control.Monad.Trans.Class.MonadTrans T3.Match.MatchT instance Control.Monad.Conc.ClassTmp.MonadConc m => T3.Game.Class.Game (T3.Match.MatchT m) module T3.Server.Dispatch data UserConfig m UserConfig :: UserName -> MatchToken -> ((Loc, Callback m) -> m ()) -> UserConfig m [_userCfgUserName] :: UserConfig m -> UserName [_userCfgMatchToken] :: UserConfig m -> MatchToken [_userCfgSendLoc] :: UserConfig m -> (Loc, Callback m) -> m () data MatchConfig m MatchConfig :: UserConfig m -> UserConfig m -> m () -> MatchConfig m [_matchCfgX] :: MatchConfig m -> UserConfig m [_matchCfgO] :: MatchConfig m -> UserConfig m [_matchCfgDie] :: MatchConfig m -> m () forkMatch :: MonadConc m => Maybe Seconds -> (UserName, MatchToken, Callback m) -> (UserName, MatchToken, Callback m) -> ([Action] -> Board -> Result -> m ()) -> m () -> m (MatchConfig m) module T3.Server.Lobby type Lobby m = [(UserName, StartCallback m)] addUserToLobby :: MonadConc m => TVar (Lobby m) -> UserName -> StartCallback m -> m Bool userPairFromLobby :: (MonadConc m, MonadRandom m) => TVar (Lobby m) -> m (Maybe ((UserName, StartCallback m), (UserName, StartCallback m))) module T3.Server type GameLogger m = MatchId -> Users -> [Action] -> Board -> Result -> m () data Server m Server :: TVar (Lobby m) -> TVar (Map MatchId (MatchConfig m)) -> TVar (Map UserName UserKey) -> m () -> GameLogger m -> Maybe Seconds -> Server m [_srvLobby] :: Server m -> TVar (Lobby m) [_srvMatches] :: Server m -> TVar (Map MatchId (MatchConfig m)) [_srvUsers] :: Server m -> TVar (Map UserName UserKey) [_srvDie] :: Server m -> m () [_srvLogger] :: Server m -> GameLogger m [_srvTimeoutLimit] :: Server m -> Maybe Seconds data UserConfig m UserConfig :: UserName -> MatchToken -> ((Loc, Callback m) -> m ()) -> UserConfig m [_userCfgUserName] :: UserConfig m -> UserName [_userCfgMatchToken] :: UserConfig m -> MatchToken [_userCfgSendLoc] :: UserConfig m -> (Loc, Callback m) -> m () data MatchConfig m MatchConfig :: UserConfig m -> UserConfig m -> m () -> MatchConfig m [_matchCfgX] :: MatchConfig m -> UserConfig m [_matchCfgO] :: MatchConfig m -> UserConfig m [_matchCfgDie] :: MatchConfig m -> m () data UserCreds UserCreds :: UserName -> UserKey -> UserCreds [_ucName] :: UserCreds -> UserName [_ucKey] :: UserCreds -> UserKey data StartRequest StartRequest :: UserCreds -> StartRequest [_sreqCreds] :: StartRequest -> UserCreds data PlayRequest PlayRequest :: UserCreds -> Loc -> PlayRequest [_preqCreds] :: PlayRequest -> UserCreds [_preqLoc] :: PlayRequest -> Loc data GameState GameState :: Board -> Maybe Final -> GameState [_gsBoard] :: GameState -> Board [_gsFinal] :: GameState -> Maybe Final data Users Users :: UserName -> UserName -> Users [_uX] :: Users -> UserName [_uO] :: Users -> UserName data StartResponse StartResponse :: MatchInfo -> Users -> GameState -> StartResponse [_srespMatchInfo] :: StartResponse -> MatchInfo [_srespUsers] :: StartResponse -> Users [_srespState] :: StartResponse -> GameState data PlayResponse PlayResponse :: GameState -> PlayResponse [_prespState] :: PlayResponse -> GameState newtype UserName UserName :: Text -> UserName newtype UserKey UserKey :: Text -> UserKey data RegisterRequest RegisterRequest :: UserName -> RegisterRequest [_rreqName] :: RegisterRequest -> UserName data RegisterResponse RegisterResponse :: UserCreds -> RegisterResponse [_rrespCreds] :: RegisterResponse -> UserCreds forkServer :: (MonadConc m, MonadRandom m) => GameLogger m -> Maybe Seconds -> Map UserName UserKey -> m (Server m) genBase64 :: MonadRandom m => Int -> m Text genMatchToken :: MonadRandom m => m MatchToken genMatchId :: MonadRandom m => m MatchId genUserName :: MonadRandom m => m UserName genUserKey :: MonadRandom m => m UserKey authenticate :: MonadConc m => Server m -> UserCreds -> STM Bool authorize :: UserName -> MatchToken -> MatchConfig m -> Maybe (UserConfig m) toGameState :: Step -> GameState instance GHC.Generics.Selector T3.Server.S1_0_2StartResponse instance GHC.Generics.Selector T3.Server.S1_0_1StartResponse instance GHC.Generics.Selector T3.Server.S1_0_0StartResponse instance GHC.Generics.Constructor T3.Server.C1_0StartResponse instance GHC.Generics.Datatype T3.Server.D1StartResponse instance GHC.Generics.Selector T3.Server.S1_0_0PlayResponse instance GHC.Generics.Constructor T3.Server.C1_0PlayResponse instance GHC.Generics.Datatype T3.Server.D1PlayResponse instance GHC.Generics.Selector T3.Server.S1_0_1GameState instance GHC.Generics.Selector T3.Server.S1_0_0GameState instance GHC.Generics.Constructor T3.Server.C1_0GameState instance GHC.Generics.Datatype T3.Server.D1GameState instance GHC.Generics.Selector T3.Server.S1_0_1PlayRequest instance GHC.Generics.Selector T3.Server.S1_0_0PlayRequest instance GHC.Generics.Constructor T3.Server.C1_0PlayRequest instance GHC.Generics.Datatype T3.Server.D1PlayRequest instance GHC.Generics.Selector T3.Server.S1_0_0StartRequest instance GHC.Generics.Constructor T3.Server.C1_0StartRequest instance GHC.Generics.Datatype T3.Server.D1StartRequest instance GHC.Generics.Selector T3.Server.S1_0_0RegisterResponse instance GHC.Generics.Constructor T3.Server.C1_0RegisterResponse instance GHC.Generics.Datatype T3.Server.D1RegisterResponse instance GHC.Generics.Selector T3.Server.S1_0_1UserCreds instance GHC.Generics.Selector T3.Server.S1_0_0UserCreds instance GHC.Generics.Constructor T3.Server.C1_0UserCreds instance GHC.Generics.Datatype T3.Server.D1UserCreds instance GHC.Generics.Selector T3.Server.S1_0_0RegisterRequest instance GHC.Generics.Constructor T3.Server.C1_0RegisterRequest instance GHC.Generics.Datatype T3.Server.D1RegisterRequest instance GHC.Generics.Generic T3.Server.StartResponse instance GHC.Classes.Eq T3.Server.StartResponse instance GHC.Show.Show T3.Server.StartResponse instance GHC.Generics.Generic T3.Server.PlayResponse instance GHC.Classes.Eq T3.Server.PlayResponse instance GHC.Show.Show T3.Server.PlayResponse instance GHC.Generics.Generic T3.Server.GameState instance GHC.Classes.Eq T3.Server.GameState instance GHC.Show.Show T3.Server.GameState instance GHC.Generics.Generic T3.Server.PlayRequest instance GHC.Classes.Eq T3.Server.PlayRequest instance GHC.Show.Show T3.Server.PlayRequest instance GHC.Generics.Generic T3.Server.StartRequest instance GHC.Classes.Eq T3.Server.StartRequest instance GHC.Show.Show T3.Server.StartRequest instance GHC.Generics.Generic T3.Server.RegisterResponse instance GHC.Classes.Eq T3.Server.RegisterResponse instance GHC.Show.Show T3.Server.RegisterResponse instance GHC.Generics.Generic T3.Server.UserCreds instance GHC.Classes.Eq T3.Server.UserCreds instance GHC.Show.Show T3.Server.UserCreds instance GHC.Generics.Generic T3.Server.RegisterRequest instance GHC.Classes.Eq T3.Server.RegisterRequest instance GHC.Show.Show T3.Server.RegisterRequest instance Data.Aeson.Types.Class.ToJSON T3.Server.UserKey instance Data.Aeson.Types.Class.FromJSON T3.Server.UserKey instance GHC.Classes.Ord T3.Server.UserKey instance GHC.Classes.Eq T3.Server.UserKey instance GHC.Show.Show T3.Server.UserKey instance Data.Aeson.Types.Class.FromJSON T3.Server.RegisterRequest instance Data.Aeson.Types.Class.ToJSON T3.Server.RegisterRequest instance Data.Aeson.Types.Class.FromJSON T3.Server.RegisterResponse instance Data.Aeson.Types.Class.ToJSON T3.Server.RegisterResponse instance Data.Aeson.Types.Class.FromJSON T3.Server.UserCreds instance Data.Aeson.Types.Class.ToJSON T3.Server.UserCreds instance Data.Aeson.Types.Class.FromJSON T3.Server.StartRequest instance Data.Aeson.Types.Class.ToJSON T3.Server.StartRequest instance Data.Aeson.Types.Class.FromJSON T3.Server.PlayRequest instance Data.Aeson.Types.Class.ToJSON T3.Server.PlayRequest instance Data.Aeson.Types.Class.FromJSON T3.Server.StartResponse instance Data.Aeson.Types.Class.ToJSON T3.Server.StartResponse instance Data.Aeson.Types.Class.FromJSON T3.Server.PlayResponse instance Data.Aeson.Types.Class.ToJSON T3.Server.PlayResponse instance Data.Aeson.Types.Class.FromJSON T3.Server.GameState instance Data.Aeson.Types.Class.ToJSON T3.Server.GameState module T3.Playback data Playback Playback :: MatchId -> Users -> [Action] -> Result -> Playback [_pbMatchId] :: Playback -> MatchId [_pbUsers] :: Playback -> Users [_pbActions] :: Playback -> [Action] [_pbResult] :: Playback -> Result writePlayback :: FilePath -> Playback -> IO () instance GHC.Classes.Eq T3.Playback.Playback instance GHC.Show.Show T3.Playback.Playback instance Data.Aeson.Types.Class.ToJSON T3.Playback.Playback instance Data.Aeson.Types.Class.FromJSON T3.Playback.Playback instance Data.Aeson.Types.Class.ToJSON T3.Game.Core.Result instance Data.Aeson.Types.Class.FromJSON T3.Game.Core.Result module T3.DB class Monad m => DB m storeUsers :: DB m => Map UserName UserKey -> m () loadUsers :: DB m => m (Map UserName UserKey) loadMatchList :: DB m => m [MatchId] storePlayback :: DB m => Playback -> m () loadPlayback :: DB m => MatchId -> m (Maybe Playback) module T3.Web class MonadIO m => HttpHandler m where httpJSONEntity = fmap decode httpRequestEntity httpRequestEntity :: HttpHandler m => m ByteString server :: HttpHandler m => m (Server IO) unauthorized :: HttpHandler m => m a badRequest :: HttpHandler m => m a badFormat :: HttpHandler m => m a alreadyInLobby :: HttpHandler m => m a httpJSONEntity :: (HttpHandler m, FromJSON a) => m (Maybe a) play :: HttpHandler m => MatchId -> MatchToken -> Maybe PlayRequest -> m PlayResponse start :: HttpHandler m => Maybe StartRequest -> m StartResponse randomHandler :: HttpHandler m => Maybe StartRequest -> m StartResponse register :: (HttpHandler m, DB m) => Maybe RegisterRequest -> m (Maybe RegisterResponse)