module Test.DejaFu.Internal where
import Control.Monad.ST (ST)
import Data.IORef (IORef, newIORef, readIORef, writeIORef)
import Data.STRef (STRef, newSTRef, readSTRef, writeSTRef)
data Ref n r m = Ref
{ newRef :: forall a. a -> n (r a)
, readRef :: forall a. r a -> n a
, writeRef :: forall a. r a -> a -> n ()
, liftN :: forall a. n a -> m a
}
refST :: (forall a. ST t a -> m a) -> Ref (ST t) (STRef t) m
refST lftN = Ref
{ newRef = newSTRef
, readRef = readSTRef
, writeRef = writeSTRef
, liftN = lftN
}
refIO :: (forall a. IO a -> m a) -> Ref IO IORef m
refIO lftN = Ref
{ newRef = newIORef
, readRef = readIORef
, writeRef = writeIORef
, liftN = lftN
}