Use StateT within Web.Scotty

前端 未结 1 651
轻奢々
轻奢々 2021-02-13 19:03

I\'m trying to make a silly webserver that stores data as State. I\'m using Web.Scotty. I\'ve used ReaderT before with scotty to access config, but following the sa

相关标签:
1条回答
  • 2021-02-13 19:34

    The behaviour you are seeing is definitely the expected one: note the remark on the third argument in the documentation for scottyT:

    -> (m Response -> IO Response) -- Run monad m into IO, called at each action.

    What you could do is store the state external to the StateT monad so that you can reinstate it in the handler of every action. The most naïve way I can think of to do that would be something like this:

    main :: IO ()
    main = do
        let s0 = "message"
        let transform = flip evalStateT s0
        runner <- restartableStateT s0
        scottyT 3000 transform runner routes
    
    restartableStateT :: s -> IO (StateT s IO a -> IO a)
    restartableStateT s0 = do
        r <- newIORef s0
        return $ \act -> do
            s <- readIORef r
            (x, s') <- runStateT act s
            atomicModifyIORef' r $ const (s', x)
    

    but this doesn't really address what should happen if two requests are coming in concurrently, it's just "last one to finish wins".

    0 讨论(0)
提交回复
热议问题