fix: mulithreading
This commit is contained in:
parent
6d4c0f73e5
commit
491dc6c569
|
@ -50,12 +50,11 @@ roomDataHandler = do
|
||||||
newRoomData <- parseBodyOrBadRequest
|
newRoomData <- parseBodyOrBadRequest
|
||||||
liftIO $ putStrLn "Got triggered from prosody"
|
liftIO $ putStrLn "Got triggered from prosody"
|
||||||
whenM (roomStateDiffers newRoomData) $ do
|
whenM (roomStateDiffers newRoomData) $ do
|
||||||
(openedRooms, closedRooms) <- roomStateDiffInOpenRooms newRoomData
|
(openedRooms, closedRooms) <- setRoomDataState newRoomData
|
||||||
|
|
||||||
mapM_ notifyRoomOpend openedRooms
|
mapM_ notifyRoomOpend openedRooms
|
||||||
mapM_ notifyRoomClosed closedRooms
|
mapM_ notifyRoomClosed closedRooms
|
||||||
|
|
||||||
setRoomDataState newRoomData
|
|
||||||
broadcastUserData
|
broadcastUserData
|
||||||
success
|
success
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
module State.GenericTVarState (GenericTVarState, updateGenericTVarState, getGenericTVarState) where
|
module State.GenericTVarState (GenericTVarState, updateGenericTVarState, updateGenericTVarStateWithQuery, getGenericTVarState) where
|
||||||
|
|
||||||
import ClassyPrelude
|
import ClassyPrelude
|
||||||
|
|
||||||
|
@ -7,5 +7,11 @@ type GenericTVarState a = TVar a
|
||||||
updateGenericTVarState :: (MonadIO m) => GenericTVarState a -> a -> m ()
|
updateGenericTVarState :: (MonadIO m) => GenericTVarState a -> a -> m ()
|
||||||
updateGenericTVarState tv a = atomically $ writeTVar tv a
|
updateGenericTVarState tv a = atomically $ writeTVar tv a
|
||||||
|
|
||||||
|
updateGenericTVarStateWithQuery :: (MonadIO m) => GenericTVarState a -> (a -> a -> b) -> a -> m b
|
||||||
|
updateGenericTVarStateWithQuery tv f a = atomically $ do
|
||||||
|
b <- readTVar tv
|
||||||
|
writeTVar tv a
|
||||||
|
return $ f b a
|
||||||
|
|
||||||
getGenericTVarState :: (MonadIO m) => GenericTVarState a -> m a
|
getGenericTVarState :: (MonadIO m) => GenericTVarState a -> m a
|
||||||
getGenericTVarState = readTVarIO
|
getGenericTVarState = readTVarIO
|
||||||
|
|
|
@ -7,8 +7,8 @@ where
|
||||||
import ClassyPrelude
|
import ClassyPrelude
|
||||||
import Types.RoomData
|
import Types.RoomData
|
||||||
|
|
||||||
class Monad m => MonadRoomDataStateModify m where
|
class (Monad m) => MonadRoomDataStateModify m where
|
||||||
setRoomDataState :: RoomsData -> m ()
|
setRoomDataState :: RoomsData -> m RoomsStateDiff
|
||||||
|
|
||||||
class Monad m => MonadRoomDataStateRead m where
|
class (Monad m) => MonadRoomDataStateRead m where
|
||||||
getRoomDataState :: m RoomsData
|
getRoomDataState :: m RoomsData
|
||||||
|
|
|
@ -3,6 +3,7 @@ module State.RoomsState
|
||||||
initRoomsState,
|
initRoomsState,
|
||||||
HasRoomsState (..),
|
HasRoomsState (..),
|
||||||
roomStateDiffers,
|
roomStateDiffers,
|
||||||
|
RoomsStateDiff,
|
||||||
roomStateDiffInOpenRooms,
|
roomStateDiffInOpenRooms,
|
||||||
updateRoomState,
|
updateRoomState,
|
||||||
getRoomState,
|
getRoomState,
|
||||||
|
@ -12,7 +13,7 @@ where
|
||||||
import ClassyPrelude
|
import ClassyPrelude
|
||||||
import State.GenericTVarState
|
import State.GenericTVarState
|
||||||
import State.RoomDataState (MonadRoomDataStateRead (getRoomDataState))
|
import State.RoomDataState (MonadRoomDataStateRead (getRoomDataState))
|
||||||
import Types.RoomData (RoomsData, roomNotEmpty, sameName)
|
import Types.RoomData (RoomsData, RoomsStateDiff, roomNotEmpty, sameName)
|
||||||
|
|
||||||
type RoomsState = GenericTVarState RoomsData
|
type RoomsState = GenericTVarState RoomsData
|
||||||
|
|
||||||
|
@ -28,12 +29,13 @@ updateRoomState ::
|
||||||
MonadReader env m
|
MonadReader env m
|
||||||
) =>
|
) =>
|
||||||
RoomsData ->
|
RoomsData ->
|
||||||
m ()
|
m RoomsStateDiff
|
||||||
updateRoomState newData = do
|
updateRoomState newData = do
|
||||||
state <- getRoomsState <$> ask
|
state <- getRoomsState <$> ask
|
||||||
liftIO $ putStrLn "Upating room state"
|
liftIO $ putStrLn "Upating room state"
|
||||||
updateGenericTVarState state newData
|
diff <- updateGenericTVarStateWithQuery state roomStateDiff newData
|
||||||
liftIO $ putStrLn "Done Upating room state"
|
liftIO $ putStrLn "Done Upating room state"
|
||||||
|
return diff
|
||||||
|
|
||||||
getRoomState ::
|
getRoomState ::
|
||||||
( HasRoomsState env,
|
( HasRoomsState env,
|
||||||
|
@ -69,5 +71,11 @@ roomStateDiffInOpenRooms newData = do
|
||||||
|
|
||||||
return (newRooms, oldRooms)
|
return (newRooms, oldRooms)
|
||||||
|
|
||||||
|
roomStateDiff :: RoomsData -> RoomsData -> RoomsStateDiff
|
||||||
|
roomStateDiff newData current = (newRooms, oldRooms)
|
||||||
|
where
|
||||||
|
newRooms = filter roomNotEmpty $ filter (\newRoom -> isNothing $ find (sameName newRoom) (filter roomNotEmpty current)) newData
|
||||||
|
oldRooms = filter (\oldRoom -> isNothing $ find (sameName oldRoom) newData) current
|
||||||
|
|
||||||
eqIgnoreOrdering :: (Eq a) => [a] -> [a] -> Bool
|
eqIgnoreOrdering :: (Eq a) => [a] -> [a] -> Bool
|
||||||
eqIgnoreOrdering a b = length a == length b && all (`elem` b) a
|
eqIgnoreOrdering a b = length a == length b && all (`elem` b) a
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{-# LANGUAGE DeriveGeneric #-}
|
{-# LANGUAGE DeriveGeneric #-}
|
||||||
|
|
||||||
module Types.RoomData (RoomData, RoomsData, sameName, roomNotEmpty, prettyPrintOpenedRoom) where
|
module Types.RoomData (RoomData, RoomsStateDiff, RoomsData, sameName, roomNotEmpty, prettyPrintOpenedRoom) where
|
||||||
|
|
||||||
import ClassyPrelude
|
import ClassyPrelude
|
||||||
import Data.Aeson (FromJSON, ToJSON)
|
import Data.Aeson (FromJSON, ToJSON)
|
||||||
|
@ -26,6 +26,8 @@ type RoomName = Text
|
||||||
|
|
||||||
type RoomsData = [RoomData]
|
type RoomsData = [RoomData]
|
||||||
|
|
||||||
|
type RoomsStateDiff = (RoomsData, RoomsData)
|
||||||
|
|
||||||
instance ToJSON RoomData
|
instance ToJSON RoomData
|
||||||
|
|
||||||
instance FromJSON RoomData
|
instance FromJSON RoomData
|
||||||
|
|
Loading…
Reference in a new issue