@@ -27,6 +27,8 @@ import qualified Data.Map as Map
27 , partitionWithKey
27 , partitionWithKey
29 , filterWithKey
29 , filterWithKey
31import Data.Set (Set)
33import Data.Set (Set)
32import qualified Data.Set as Set (empty, insert, delete, member)
34import qualified Data.Set as Set (empty, insert, delete, member)
@@ -293,7 +295,7 @@ incomingAt :: NT.ConnectionId -> Accessor ConnectionState (Maybe IncomingConnect
293incomingAt cid = incoming >>> DAC.mapMaybe cid
295incomingAt cid = incoming >>> DAC.mapMaybe cid
295incomingFrom :: NT.EndPointAddress -> Accessor ConnectionState (Set NT.ConnectionId)
297incomingFrom :: NT.EndPointAddress -> Accessor ConnectionState (Set NT.ConnectionId)
296−incomingFrom addr = aux >>> DAC.mapDefault Set.empty addr
298+incomingFrom addr = aux >>> strictMapDefault Set.empty addr
298 aux = accessor _incomingFrom (\fr st -> st { _incomingFrom = fr })
300 aux = accessor _incomingFrom (\fr st -> st { _incomingFrom = fr })
@@ -755,9 +757,15 @@ splitNotif :: Identifier
755splitNotif ident = Map.partitionWithKey (\k !_v -> ident `impliesDeathOf` k)
757splitNotif ident = Map.partitionWithKey (\k !_v -> ident `impliesDeathOf` k)
757--------------------------------------------------------------------------------
759--------------------------------------------------------------------------------
758−-- Strict evaluation of the state --
760+-- Auxiliary --
759--------------------------------------------------------------------------------
761--------------------------------------------------------------------------------
761-- | Modify and evaluate the state
763-- | Modify and evaluate the state
762modify' :: MonadState s m => (s -> s) -> m ()
764modify' :: MonadState s m => (s -> s) -> m ()
763modify' f = StateT.get >>= \s -> StateT.put $! f s
765modify' f = StateT.get >>= \s -> StateT.put $! f s
767+-- | Strict lens for Map
768+strictMapDefault :: Ord key => elem -> key -> Accessor (Map key elem) elem
769+strictMapDefault def key =
770+ accessor (Map.findWithDefault def key)
771+ (\val -> val `seq` Map.insert key val)