Skip to content

Commit b4f7965

Browse files
committed
Improve MutVar interop with IORef and STRef
1 parent 2e95fd0 commit b4f7965

File tree

1 file changed

+30
-2
lines changed

1 file changed

+30
-2
lines changed

Data/Primitive/MutVar.hs

+30-2
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,24 @@ module Data.Primitive.MutVar (
1919
readMutVar,
2020
writeMutVar,
2121

22+
-- * Modify
2223
atomicModifyMutVar,
2324
atomicModifyMutVar',
2425
modifyMutVar,
25-
modifyMutVar'
26+
modifyMutVar',
27+
-- * Interop with STRef and IORef
28+
mutVarFromIORef,
29+
mutVarToIORef,
30+
mutVarFromSTRef,
31+
mutVarToSTRef
2632
) where
2733

2834
import Control.Monad.Primitive ( PrimMonad(..), primitive_ )
35+
import GHC.IORef (IORef(IORef))
36+
import GHC.STRef (STRef(STRef))
2937
import GHC.Exts ( MutVar#, sameMutVar#, newMutVar#
3038
, readMutVar#, writeMutVar#, atomicModifyMutVar#
31-
, isTrue# )
39+
, isTrue#, RealWorld)
3240
import Data.Typeable ( Typeable )
3341

3442
-- | A 'MutVar' behaves like a single-element mutable array associated
@@ -103,3 +111,23 @@ modifyMutVar' :: PrimMonad m => MutVar (PrimState m) a -> (a -> a) -> m ()
103111
modifyMutVar' (MutVar mv#) g = primitive_ $ \s# ->
104112
case readMutVar# mv# s# of
105113
(# s'#, a #) -> let a' = g a in a' `seq` writeMutVar# mv# a' s'#
114+
115+
-- | Convert 'MutVar' to 'IORef'
116+
mutVarToIORef :: MutVar RealWorld a -> IORef a
117+
{-# INLINE mutVarToIORef #-}
118+
mutVarToIORef (MutVar mv#) = IORef (STRef mv#)
119+
120+
-- | Convert 'MutVar' to 'IORef'
121+
mutVarFromIORef :: IORef a -> MutVar RealWorld a
122+
{-# INLINE mutVarFromIORef #-}
123+
mutVarFromIORef (IORef (STRef mv#)) = MutVar mv#
124+
125+
-- | Convert 'MutVar' to 'STRef'
126+
mutVarToSTRef :: MutVar s a -> STRef s a
127+
{-# INLINE mutVarToSTRef #-}
128+
mutVarToSTRef (MutVar mv#) = STRef mv#
129+
130+
-- | Convert 'MutVar' to 'STRef'
131+
mutVarFromSTRef :: STRef s a -> MutVar s a
132+
{-# INLINE mutVarFromSTRef #-}
133+
mutVarFromSTRef (STRef mv#) = MutVar mv#

0 commit comments

Comments
 (0)