2013-02-22 16 views
7

Sto cercando di implementare un server per un gioco a turni in Haskell. La mia scelta sarebbe quella di utilizzare Yesod per l'amministrazione e le meta-informazioni (ad esempio, a quali giochi partecipa un utente e così via).Yesod, WebSockets e persistente

Mi piacerebbe utilizzare le prese per mantenere piccoli i dati in gioco.

Guardando all'esempio di ws-chat, non sono sicuro di come accedere al Gestore Monad e con esso Persistente.

Sarebbe perfetto avere un codice contabile per le connessioni avvolto attorno a un gestore "normale" che aggiorna il database e informa gli utenti pertinenti.

+0

Questo esempio è utile? https://github.com/gertcuykens/haskell-design –

+0

Non proprio, Gert. Sto cercando un modo per usare la libreria Yesods Persist piuttosto che Acid. In generale, mi piacerebbe avere un modo per avviare Yesad Handler Monad da WS.intercept-Handler. – SmokeDispenser

risposta

7

Questo è come penso dovrebbe essere.

{-# LANGUAGE QuasiQuotes, TypeFamilies, GeneralizedNewtypeDeriving, TemplateHaskell, OverloadedStrings, GADTs, FlexibleContexts #-} 
module Main where 
import Control.Monad.IO.Class (liftIO) 
import Data.String (fromString) 
import Database.Persist 
import Database.Persist.TH 
import Database.Persist.Sqlite 
import Network.Wai.Application.Static (staticApp, defaultWebAppSettings, defaultFileServerSettings) 
import Network.Wai.Handler.Warp (runSettings, defaultSettings, settingsIntercept, settingsPort) 
import Network.Wai.Handler.WebSockets (intercept) 
import qualified Network.WebSockets as WS 

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistUpperCase| 
Person 
    name String 
    age Int 
    deriving Show 
|] 

ws :: WS.Request -> WS.WebSockets WS.Hybi10() 
ws r = do 
    WS.acceptRequest r 
    liftIO $ runSqlite ":memory:" $ do 
     runMigration migrateAll 
     michaelId <- insert $ Person "Michael" 26 
     michael <- get michaelId 
     liftIO $ print michael 

main :: IO() 
main = runSettings defaultSettings 
    { settingsPort = 9160 
    , settingsIntercept = intercept $ ws 
    } $ staticApp (defaultFileServerSettings $ fromString ".") 
4

Se stai cercando di eseguire da solo una monade Handler, puoi utilizzare runFakeHandler.

+0

Non so se sto parlando dello stesso gestore di Jan ma puoi fare qualcosa del genere :) https://gist.github.com/gertcuykens/5022515 –

+0

Sì Gert, questo è quello che stavo cercando, grazie :) Michael: Grazie per la risposta. Sembra che sia stato impreciso nel descrivere i miei obiettivi; eppure Gert sembrava ottenere ciò che volevo con il tuo input :) Inoltre, ottimo lavoro su Yesod! Grazie mille per questo :) Non sono sicuro di dover "accettare" la tua risposta, dato che è il commento di Gerts che fa il trucco. – SmokeDispenser

+0

Puoi elencare la tua versione perché Michael è quello che sa per certo se ci sono problemi di prestazioni o qualcosa del genere. –