diff options
| author | Roman Smrž <roman.smrz@seznam.cz> | 2026-06-21 21:49:18 +0200 |
|---|---|---|
| committer | Roman Smrž <roman.smrz@seznam.cz> | 2026-06-21 22:06:04 +0200 |
| commit | 7f39ef530bb09eec5bb07c60b0f8f622a1a31698 (patch) | |
| tree | 3d1a869dfdb0826e5262ea66e0a1114f8cb56a59 | |
| parent | 9e6d2603fe654f908cede454ba89bd2f2f23dadf (diff) | |
| -rw-r--r-- | src/Erebos/DirectMessage.hs | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/src/Erebos/DirectMessage.hs b/src/Erebos/DirectMessage.hs index e97672d..3833d1f 100644 --- a/src/Erebos/DirectMessage.hs +++ b/src/Erebos/DirectMessage.hs @@ -422,23 +422,34 @@ messageThreadFor pthread mss = watchDirectMessageThreads :: Head LocalState -> (DirectMessageThread -> DirectMessageThread -> IO ()) -> IO WatchedHead -watchDirectMessageThreads h f = do +watchDirectMessageThreads h callback = do prevVar <- newMVar Nothing watchHeadWith h (lookupSharedValue . lsShared . headObject) $ \(DirectMessageThreads sms _) -> do modifyMVar_ prevVar $ \case - Just prev -> do + Just ( prev, prevPeers ) -> do let addPeer (p : ps) p' | p `sameIdentity` p' = p : ps | otherwise = p : addPeer ps p' addPeer [] p' = [ p' ] - - let peers = foldl' addPeer [] $ map (msPeer . fromStored) $ storedDifference prev sms - forM_ peers $ \peer -> do - f (messageThreadFor (dmEmptyThread peer) prev) (messageThreadFor (dmEmptyThread peer) sms) - return (Just sms) + let changedPeers = foldl' addPeer [] $ map (msPeer . fromStored) $ storedDifference prev sms + + let updatePeer (px@( p, x ) : ps) p' f + | p `sameIdentity` p' = let x' = f x in ( ( x, x' ), ( p', x' ) : ps ) + | otherwise = (px :) <$> updatePeer ps p' f + updatePeer [] p' f = + let x = dmEmptyThread p'; x' = f x + in ( ( x, x' ), [ ( p', x' ) ] ) + + peers <- (\f -> foldM f prevPeers changedPeers) $ \peers peer -> do + let ( ( t, t' ), peers' ) = updatePeer peers peer $ \pt -> + messageThreadFor pt sms + callback t t' + return peers' + return (Just ( sms, peers )) Nothing -> do - return (Just sms) + return (Just ( sms, [] )) + formatDirectMessage :: TimeZone -> DirectMessage -> String formatDirectMessage tzone msg = concat |