@@ -19,16 +19,24 @@ module Data.Primitive.MutVar (
19
19
readMutVar ,
20
20
writeMutVar ,
21
21
22
+ -- * Modify
22
23
atomicModifyMutVar ,
23
24
atomicModifyMutVar' ,
24
25
modifyMutVar ,
25
- modifyMutVar'
26
+ modifyMutVar' ,
27
+ -- * Interop with STRef and IORef
28
+ mutVarFromIORef ,
29
+ mutVarToIORef ,
30
+ mutVarFromSTRef ,
31
+ mutVarToSTRef
26
32
) where
27
33
28
34
import Control.Monad.Primitive ( PrimMonad (.. ), primitive_ )
35
+ import GHC.IORef (IORef (IORef ))
36
+ import GHC.STRef (STRef (STRef ))
29
37
import GHC.Exts ( MutVar #, sameMutVar #, newMutVar #
30
38
, readMutVar #, writeMutVar #, atomicModifyMutVar #
31
- , isTrue # )
39
+ , isTrue #, RealWorld )
32
40
import Data.Typeable ( Typeable )
33
41
34
42
-- | A 'MutVar' behaves like a single-element mutable array associated
@@ -103,3 +111,23 @@ modifyMutVar' :: PrimMonad m => MutVar (PrimState m) a -> (a -> a) -> m ()
103
111
modifyMutVar' (MutVar mv# ) g = primitive_ $ \ s# ->
104
112
case readMutVar# mv# s# of
105
113
(# 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