{-# LANGUAGE BangPatterns #-} {-# LANGUAGE ExplicitNamespaces #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE UndecidableInstances #-} -- | This module corresponds to `Control.Concurrent.STM.TArray` in "stm" package -- module Control.Concurrent.Class.MonadSTM.Strict.TArray ( StrictTArray , LazyTArray , toLazyTArray , fromLazyTArray ) where import Control.Concurrent.Class.MonadSTM.TArray qualified as Lazy import Data.Array.Base (MArray (..)) type LazyTArray m = Lazy.TArray m newtype StrictTArray m i e = StrictTArray { toLazyTArray :: LazyTArray m i e } fromLazyTArray :: LazyTArray m i e -> StrictTArray m i e fromLazyTArray = StrictTArray instance ( MArray (Lazy.TArray m) e stm , Monad stm ) => MArray (StrictTArray m) e stm where getBounds (StrictTArray arr) = getBounds arr newArray b !e = StrictTArray <$> newArray b e newArray_ b = StrictTArray <$> newArray_ b unsafeRead (StrictTArray arr) i = unsafeRead arr i unsafeWrite (StrictTArray arr) i !e = unsafeWrite arr i e getNumElements (StrictTArray arr) = getNumElements arr