use TMap for subscription maps (#341)

* use TMap for subscription maps

* refactor

* correction
This commit is contained in:
Evgeny Poberezkin
2022-03-28 18:49:17 +01:00
committed by GitHub
parent 6ef6bedc03
commit cd22e06b3a
4 changed files with 76 additions and 60 deletions
+22 -12
View File
@@ -1,6 +1,7 @@
module Simplex.Messaging.TMap
( TMap (..),
( TMap,
empty,
singleton,
Simplex.Messaging.TMap.lookup,
member,
insert,
@@ -10,6 +11,7 @@ module Simplex.Messaging.TMap
adjust,
update,
alter,
union,
)
where
@@ -17,44 +19,52 @@ import Control.Concurrent.STM
import Data.Map.Strict (Map)
import qualified Data.Map.Strict as M
newtype TMap k a = TMap {tVar :: TVar (Map k a)}
type TMap k a = TVar (Map k a)
empty :: STM (TMap k a)
empty = TMap <$> newTVar M.empty
empty = newTVar M.empty
{-# INLINE empty #-}
singleton :: k -> a -> STM (TMap k a)
singleton k v = newTVar $ M.singleton k v
{-# INLINE singleton #-}
lookup :: Ord k => k -> TMap k a -> STM (Maybe a)
lookup k (TMap m) = M.lookup k <$> readTVar m
lookup k m = M.lookup k <$> readTVar m
{-# INLINE lookup #-}
member :: Ord k => k -> TMap k a -> STM Bool
member k (TMap m) = M.member k <$> readTVar m
member k m = M.member k <$> readTVar m
{-# INLINE member #-}
insert :: Ord k => k -> a -> TMap k a -> STM ()
insert k v (TMap m) = modifyTVar' m $ M.insert k v
insert k v m = modifyTVar' m $ M.insert k v
{-# INLINE insert #-}
delete :: Ord k => k -> TMap k a -> STM ()
delete k (TMap m) = modifyTVar' m $ M.delete k
delete k m = modifyTVar' m $ M.delete k
{-# INLINE delete #-}
lookupInsert :: Ord k => k -> a -> TMap k a -> STM (Maybe a)
lookupInsert k v (TMap m) = stateTVar m $ \mv -> (M.lookup k mv, M.insert k v mv)
lookupInsert k v m = stateTVar m $ \mv -> (M.lookup k mv, M.insert k v mv)
{-# INLINE lookupInsert #-}
lookupDelete :: Ord k => k -> TMap k a -> STM (Maybe a)
lookupDelete k (TMap m) = stateTVar m $ \mv -> (M.lookup k mv, M.delete k mv)
lookupDelete k m = stateTVar m $ \mv -> (M.lookup k mv, M.delete k mv)
{-# INLINE lookupDelete #-}
adjust :: Ord k => (a -> a) -> k -> TMap k a -> STM ()
adjust f k (TMap m) = modifyTVar' m $ M.adjust f k
adjust f k m = modifyTVar' m $ M.adjust f k
{-# INLINE adjust #-}
update :: Ord k => (a -> Maybe a) -> k -> TMap k a -> STM ()
update f k (TMap m) = modifyTVar' m $ M.update f k
update f k m = modifyTVar' m $ M.update f k
{-# INLINE update #-}
alter :: Ord k => (Maybe a -> Maybe a) -> k -> TMap k a -> STM ()
alter f k (TMap m) = modifyTVar' m $ M.alter f k
alter f k m = modifyTVar' m $ M.alter f k
{-# INLINE alter #-}
union :: Ord k => Map k a -> TMap k a -> STM ()
union m' m = modifyTVar' m $ M.union m'
{-# INLINE union #-}