{-# LANGUAGE CPP #-}
{-# LANGUAGE UnicodeSyntax #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
#if __GLASGOW_HASKELL__ >= 800
{-# OPTIONS_GHC -Wno-orphans #-}
#endif

-- | Lifted 'TArray' operations.
module Control.Concurrent.STM.TArray.Lifted
  ( TArray
  ) where

import Data.Array.Base (MArray(..))
import Control.Monad.Base (MonadBase(..))
import Control.Monad.STM (STM)
import Control.Concurrent.STM.TArray (TArray)

instance {-# OVERLAPPABLE #-} MonadBase STM μ  MArray TArray e μ where
  getBounds = liftBase . getBounds
  {-# INLINE getBounds #-}
  newArray = (liftBase .) . newArray
  {-# INLINE newArray #-}
  newArray_ = liftBase . newArray_
  {-# INLINE newArray_ #-}
  unsafeRead = (liftBase .) . unsafeRead
  {-# INLINE unsafeRead #-}
  unsafeWrite = ((liftBase .) .) . unsafeWrite
  {-# INLINE unsafeWrite #-}
  getNumElements = liftBase . getNumElements
  {-# INLINE getNumElements #-}