{-# LANGUAGE CPP , DeriveDataTypeable , FlexibleContexts , FlexibleInstances , MultiParamTypeClasses #-} {- | Copyright : (c) Andy Sonnenburg 2013 License : BSD3 Maintainer : andy22286@gmail.com -} module Data.Var.ST ( module Data.Var.Class , STVar , STUVar ) where #ifdef MODULE_Control_Monad_ST_Safe import Control.Monad.ST.Safe import qualified Control.Monad.ST.Lazy.Safe as Lazy #else import Control.Monad.ST import qualified Control.Monad.ST.Lazy as Lazy #endif import Data.ByteArraySlice import Data.STVar import Data.Var.ByteArray import Data.Var.Class import Data.Typeable newtype STUVar s a = STUVar { unSTUVar :: ByteArrayVar s a } deriving (Eq, Typeable) {- ^ a value of type @'STUVar' s a@ is a mutable variable in state thread @s@, containing an unboxed value of type @a@ -} instance ByteArraySlice a => Var (STUVar s) a (ST s) where newVar = fmap STUVar . newVar readVar = readVar . unSTUVar writeVar = writeVar . unSTUVar instance ByteArraySlice a => Var (STUVar s) a (Lazy.ST s) where newVar = fmap STUVar . newVar readVar = readVar . unSTUVar writeVar = writeVar . unSTUVar