Skip to content

Instantly share code, notes, and snippets.

@carymrobbins
Created February 17, 2022 21:09
Show Gist options
  • Save carymrobbins/a74d8db5f4de9c3445237d71fe0f8d2b to your computer and use it in GitHub Desktop.
Save carymrobbins/a74d8db5f4de9c3445237d71fe0f8d2b to your computer and use it in GitHub Desktop.
module STMUtil where
import Prelude
import Control.Concurrent.STM (STM)
import Data.HashMap.Strict (HashMap)
import Data.Hashable (Hashable)
import qualified Data.HashMap.Strict as HashMap
import qualified Debug.Trace
import qualified ListT as LT
import qualified StmContainers.Map as StmMap
import qualified Text.Show
{-# WARNING traceWithM "traceWithM" #-}
traceWithM :: (Monad m, Show a) => String -> m a -> m ()
traceWithM prefix ma = do
a <- ma
Debug.Trace.traceM $ prefix <> show a
stmToHashMap
:: (Eq k, Hashable k)
=> StmMap.Map k v
-> STM (HashMap k v)
stmToHashMap = stmToHashMapWith pure
stmToHashMap2
:: (Eq k0, Hashable k0, Eq k1, Hashable k1)
=> StmMap.Map k0 (StmMap.Map k1 v)
-> STM (HashMap k0 (HashMap k1 v))
stmToHashMap2 = stmToHashMapWith stmToHashMap
stmToHashMap3
:: (Eq k0, Hashable k0, Eq k1, Hashable k1, Eq k2, Hashable k2)
=> StmMap.Map k0 (StmMap.Map k1 (StmMap.Map k2 v))
-> STM (HashMap k0 (HashMap k1 (HashMap k2 v)))
stmToHashMap3 = stmToHashMapWith stmToHashMap2
stmToHashMap4
:: (Eq k0, Hashable k0, Eq k1, Hashable k1, Eq k2, Hashable k2, Eq k3, Hashable k3)
=> StmMap.Map k0 (StmMap.Map k1 (StmMap.Map k2 (StmMap.Map k3 v)))
-> STM (HashMap k0 (HashMap k1 (HashMap k2 (HashMap k3 v))))
stmToHashMap4 = stmToHashMapWith stmToHashMap3
stmToHashMapWith
:: (Eq k, Hashable k)
=> (v0 -> STM v1)
-> StmMap.Map k v0
-> STM (HashMap k v1)
stmToHashMapWith f s =
LT.fold go HashMap.empty $ StmMap.listT s
where
go m (k, v0) = do
v1 <- f v0
pure $ HashMap.insert k v1 m
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment