-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathUserData.hs
35 lines (31 loc) · 1.16 KB
/
UserData.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
module UserData
( newUserData
, updateUserData
, UserData
)
where
import Control.Concurrent ( MVar
, newMVar
, putMVar
, readMVar
, takeMVar
)
import Control.Monad.Except ( ExceptT, liftIO )
import Data.Hashable ( Hashable )
import Data.Maybe ( fromMaybe )
import qualified Data.HashMap.Strict as Map
type UserData sesid state = MVar (Map.HashMap sesid state)
newUserData :: (Eq sesid, Hashable sesid) => IO (UserData sesid state)
newUserData = newMVar Map.empty
updateUserData
:: (Eq sesid, Hashable sesid)
=> state
-> UserData sesid state
-> sesid
-> (state -> ExceptT e IO state)
-> ExceptT e IO ()
updateUserData defState db sesid f = do
all <- liftIO $ readMVar db
let state = fromMaybe defState $ Map.lookup sesid all
newState <- f state
liftIO $ putMVar db . Map.insert sesid newState =<< takeMVar db