fix: mulithreading

This commit is contained in:
qvalentin 2025-01-25 18:21:48 +01:00
parent 6d4c0f73e5
commit 491dc6c569
5 changed files with 25 additions and 10 deletions

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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