(original) (raw)
{-# LANGUAGE GeneralizedNewtypeDeriving, FlexibleContexts, TypeFamilies, FlexibleInstances, MultiParamTypeClasses #-}
module Control.Monad.Trans.Memo.ReaderCache (
ReaderCache, evalReaderCache, container
) where
import Control.Applicative import Control.Monad import Control.Monad.IO.Class import Control.Monad.Fix import Control.Monad.Primitive import Control.Monad.ST import Control.Monad.Trans.Class import Control.Monad.Trans.Reader import Data.Array.Base import Data.Array.IO import Data.Array.ST
newtype ReaderCache c m a = ReaderCache { ReaderCache c m a -> ReaderT c m a toReaderT :: ReaderT c m a } deriving (a -> ReaderCache c m b -> ReaderCache c m a (a -> b) -> ReaderCache c m a -> ReaderCache c m b (forall a b. (a -> b) -> ReaderCache c m a -> ReaderCache c m b) -> (forall a b. a -> ReaderCache c m b -> ReaderCache c m a) -> Functor (ReaderCache c m) forall a b. a -> ReaderCache c m b -> ReaderCache c m a forall a b. (a -> b) -> ReaderCache c m a -> ReaderCache c m b forall c (m :: * -> *) a b. Functor m => a -> ReaderCache c m b -> ReaderCache c m a forall c (m :: * -> *) a b. Functor m => (a -> b) -> ReaderCache c m a -> ReaderCache c m b forall (f :: * -> *). (forall a b. (a -> b) -> f a -> f b) -> (forall a b. a -> f b -> f a) -> Functor f <$ :: a -> ReaderCache c m b -> ReaderCache c m a c<c<c< :: forall c (m :: * -> *) a b. Functor m => a -> ReaderCache c m b -> ReaderCache c m a fmap :: (a -> b) -> ReaderCache c m a -> ReaderCache c m b $cfmap :: forall c (m :: * -> *) a b. Functor m => (a -> b) -> ReaderCache c m a -> ReaderCache c m b Functor, Functor (ReaderCache c m) a -> ReaderCache c m a Functor (ReaderCache c m) -> (forall a. a -> ReaderCache c m a) -> (forall a b. ReaderCache c m (a -> b) -> ReaderCache c m a -> ReaderCache c m b) -> (forall a b c. (a -> b -> c) -> ReaderCache c m a -> ReaderCache c m b -> ReaderCache c m c) -> (forall a b. ReaderCache c m a -> ReaderCache c m b -> ReaderCache c m b) -> (forall a b. ReaderCache c m a -> ReaderCache c m b -> ReaderCache c m a) -> Applicative (ReaderCache c m) ReaderCache c m a -> ReaderCache c m b -> ReaderCache c m b ReaderCache c m a -> ReaderCache c m b -> ReaderCache c m a ReaderCache c m (a -> b) -> ReaderCache c m a -> ReaderCache c m b (a -> b -> c) -> ReaderCache c m a -> ReaderCache c m b -> ReaderCache c m c forall a. a -> ReaderCache c m a forall a b. ReaderCache c m a -> ReaderCache c m b -> ReaderCache c m a forall a b. ReaderCache c m a -> ReaderCache c m b -> ReaderCache c m b forall a b. ReaderCache c m (a -> b) -> ReaderCache c m a -> ReaderCache c m b forall a b c. (a -> b -> c) -> ReaderCache c m a -> ReaderCache c m b -> ReaderCache c m c forall c (m :: * -> *). Applicative m => Functor (ReaderCache c m) forall c (m :: * -> *) a. Applicative m => a -> ReaderCache c m a forall c (m :: * -> *) a b. Applicative m => ReaderCache c m a -> ReaderCache c m b -> ReaderCache c m a forall c (m :: * -> *) a b. Applicative m => ReaderCache c m a -> ReaderCache c m b -> ReaderCache c m b forall c (m :: * -> *) a b. Applicative m => ReaderCache c m (a -> b) -> ReaderCache c m a -> ReaderCache c m b forall c (m :: * -> *) a b c. Applicative m => (a -> b -> c) -> ReaderCache c m a -> ReaderCache c m b -> ReaderCache c m c forall (f :: * -> *). Functor f -> (forall a. a -> f a) -> (forall a b. f (a -> b) -> f a -> f b) -> (forall a b c. (a -> b -> c) -> f a -> f b -> f c) -> (forall a b. f a -> f b -> f b) -> (forall a b. f a -> f b -> f a) -> Applicative f <* :: ReaderCache c m a -> ReaderCache c m b -> ReaderCache c m a $c<* :: forall c (m :: * -> *) a b. Applicative m => ReaderCache c m a -> ReaderCache c m b -> ReaderCache c m a > :: ReaderCache c m a -> ReaderCache c m b -> ReaderCache c m b $c> :: forall c (m :: * -> *) a b. Applicative m => ReaderCache c m a -> ReaderCache c m b -> ReaderCache c m b liftA2 :: (a -> b -> c) -> ReaderCache c m a -> ReaderCache c m b -> ReaderCache c m c $cliftA2 :: forall c (m :: * -> *) a b c. Applicative m => (a -> b -> c) -> ReaderCache c m a -> ReaderCache c m b -> ReaderCache c m c <*> :: ReaderCache c m (a -> b) -> ReaderCache c m a -> ReaderCache c m b $c<*> :: forall c (m :: * -> *) a b. Applicative m => ReaderCache c m (a -> b) -> ReaderCache c m a -> ReaderCache c m b pure :: a -> ReaderCache c m a $cpure :: forall c (m :: * -> *) a. Applicative m => a -> ReaderCache c m a $cp1Applicative :: forall c (m :: * -> *). Applicative m => Functor (ReaderCache c m) Applicative, Applicative (ReaderCache c m) ReaderCache c m a Applicative (ReaderCache c m) -> (forall a. ReaderCache c m a) -> (forall a. ReaderCache c m a -> ReaderCache c m a -> ReaderCache c m a) -> (forall a. ReaderCache c m a -> ReaderCache c m [a]) -> (forall a. ReaderCache c m a -> ReaderCache c m [a]) -> Alternative (ReaderCache c m) ReaderCache c m a -> ReaderCache c m a -> ReaderCache c m a ReaderCache c m a -> ReaderCache c m [a] ReaderCache c m a -> ReaderCache c m [a] forall a. ReaderCache c m a forall a. ReaderCache c m a -> ReaderCache c m [a] forall a. ReaderCache c m a -> ReaderCache c m a -> ReaderCache c m a forall c (m :: * -> *). Alternative m => Applicative (ReaderCache c m) forall c (m :: * -> *) a. Alternative m => ReaderCache c m a forall c (m :: * -> *) a. Alternative m => ReaderCache c m a -> ReaderCache c m [a] forall c (m :: * -> *) a. Alternative m => ReaderCache c m a -> ReaderCache c m a -> ReaderCache c m a forall (f :: * -> *). Applicative f -> (forall a. f a) -> (forall a. f a -> f a -> f a) -> (forall a. f a -> f [a]) -> (forall a. f a -> f [a]) -> Alternative f many :: ReaderCache c m a -> ReaderCache c m [a] $cmany :: forall c (m :: * -> *) a. Alternative m => ReaderCache c m a -> ReaderCache c m [a] some :: ReaderCache c m a -> ReaderCache c m [a] $csome :: forall c (m :: * -> *) a. Alternative m => ReaderCache c m a -> ReaderCache c m [a] <|> :: ReaderCache c m a -> ReaderCache c m a -> ReaderCache c m a $c<|> :: forall c (m :: * -> *) a. Alternative m => ReaderCache c m a -> ReaderCache c m a -> ReaderCache c m a empty :: ReaderCache c m a $cempty :: forall c (m :: * -> *) a. Alternative m => ReaderCache c m a $cp1Alternative :: forall c (m :: * -> *). Alternative m => Applicative (ReaderCache c m) Alternative, Applicative (ReaderCache c m) a -> ReaderCache c m a Applicative (ReaderCache c m) -> (forall a b. ReaderCache c m a -> (a -> ReaderCache c m b) -> ReaderCache c m b) -> (forall a b. ReaderCache c m a -> ReaderCache c m b -> ReaderCache c m b) -> (forall a. a -> ReaderCache c m a) -> Monad (ReaderCache c m) ReaderCache c m a -> (a -> ReaderCache c m b) -> ReaderCache c m b ReaderCache c m a -> ReaderCache c m b -> ReaderCache c m b forall a. a -> ReaderCache c m a forall a b. ReaderCache c m a -> ReaderCache c m b -> ReaderCache c m b forall a b. ReaderCache c m a -> (a -> ReaderCache c m b) -> ReaderCache c m b forall c (m :: * -> *). Monad m => Applicative (ReaderCache c m) forall c (m :: * -> *) a. Monad m => a -> ReaderCache c m a forall c (m :: * -> *) a b. Monad m => ReaderCache c m a -> ReaderCache c m b -> ReaderCache c m b forall c (m :: * -> *) a b. Monad m => ReaderCache c m a -> (a -> ReaderCache c m b) -> ReaderCache c m b forall (m :: * -> *). Applicative m -> (forall a b. m a -> (a -> m b) -> m b) -> (forall a b. m a -> m b -> m b) -> (forall a. a -> m a) -> Monad m return :: a -> ReaderCache c m a $creturn :: forall c (m :: * -> *) a. Monad m => a -> ReaderCache c m a
:: ReaderCache c m a -> ReaderCache c m b -> ReaderCache c m b $c>> :: forall c (m :: * -> *) a b. Monad m => ReaderCache c m a -> ReaderCache c m b -> ReaderCache c m b = :: ReaderCache c m a -> (a -> ReaderCache c m b) -> ReaderCache c m b $c>>= :: forall c (m :: * -> *) a b. Monad m => ReaderCache c m a -> (a -> ReaderCache c m b) -> ReaderCache c m b $cp1Monad :: forall c (m :: * -> *). Monad m => Applicative (ReaderCache c m) Monad, Monad (ReaderCache c m) Alternative (ReaderCache c m) ReaderCache c m a Alternative (ReaderCache c m) -> Monad (ReaderCache c m) -> (forall a. ReaderCache c m a) -> (forall a. ReaderCache c m a -> ReaderCache c m a -> ReaderCache c m a) -> MonadPlus (ReaderCache c m) ReaderCache c m a -> ReaderCache c m a -> ReaderCache c m a forall a. ReaderCache c m a forall a. ReaderCache c m a -> ReaderCache c m a -> ReaderCache c m a forall c (m :: * -> *). MonadPlus m => Monad (ReaderCache c m) forall c (m :: * -> *). MonadPlus m => Alternative (ReaderCache c m) forall c (m :: * -> *) a. MonadPlus m => ReaderCache c m a forall c (m :: * -> *) a. MonadPlus m => ReaderCache c m a -> ReaderCache c m a -> ReaderCache c m a forall (m :: * -> *). Alternative m -> Monad m -> (forall a. m a) -> (forall a. m a -> m a -> m a) -> MonadPlus m mplus :: ReaderCache c m a -> ReaderCache c m a -> ReaderCache c m a $cmplus :: forall c (m :: * -> *) a. MonadPlus m => ReaderCache c m a -> ReaderCache c m a -> ReaderCache c m a mzero :: ReaderCache c m a $cmzero :: forall c (m :: * -> *) a. MonadPlus m => ReaderCache c m a $cp2MonadPlus :: forall c (m :: * -> *). MonadPlus m => Monad (ReaderCache c m) $cp1MonadPlus :: forall c (m :: * -> *). MonadPlus m => Alternative (ReaderCache c m) MonadPlus, Monad (ReaderCache c m) Monad (ReaderCache c m) -> (forall a. (a -> ReaderCache c m a) -> ReaderCache c m a) -> MonadFix (ReaderCache c m) (a -> ReaderCache c m a) -> ReaderCache c m a forall a. (a -> ReaderCache c m a) -> ReaderCache c m a forall c (m :: * -> *). MonadFix m => Monad (ReaderCache c m) forall c (m :: * -> *) a. MonadFix m => (a -> ReaderCache c m a) -> ReaderCache c m a forall (m :: * -> *). Monad m -> (forall a. (a -> m a) -> m a) -> MonadFix m mfix :: (a -> ReaderCache c m a) -> ReaderCache c m a $cmfix :: forall c (m :: * -> *) a. MonadFix m => (a -> ReaderCache c m a) -> ReaderCache c m a $cp1MonadFix :: forall c (m :: * -> *). MonadFix m => Monad (ReaderCache c m) MonadFix, m a -> ReaderCache c m a (forall (m :: * -> *) a. Monad m => m a -> ReaderCache c m a) -> MonadTrans (ReaderCache c) forall c (m :: * -> *) a. Monad m => m a -> ReaderCache c m a forall (m :: * -> ) a. Monad m => m a -> ReaderCache c m a forall (t :: ( -> *) -> * -> *). (forall (m :: * -> *) a. Monad m => m a -> t m a) -> MonadTrans t lift :: m a -> ReaderCache c m a $clift :: forall c (m :: * -> *) a. Monad m => m a -> ReaderCache c m a MonadTrans, Monad (ReaderCache c m) Monad (ReaderCache c m) -> (forall a. IO a -> ReaderCache c m a) -> MonadIO (ReaderCache c m) IO a -> ReaderCache c m a forall a. IO a -> ReaderCache c m a forall c (m :: * -> *). MonadIO m => Monad (ReaderCache c m) forall c (m :: * -> *) a. MonadIO m => IO a -> ReaderCache c m a forall (m :: * -> *). Monad m -> (forall a. IO a -> m a) -> MonadIO m liftIO :: IO a -> ReaderCache c m a $cliftIO :: forall c (m :: * -> *) a. MonadIO m => IO a -> ReaderCache c m a $cp1MonadIO :: forall c (m :: * -> *). MonadIO m => Monad (ReaderCache c m) MonadIO)
{-# INLINE evalReaderCache #-} evalReaderCache :: ReaderCache r m a -> r -> m a evalReaderCache :: ReaderCache r m a -> r -> m a evalReaderCache = ReaderT r m a -> r -> m a forall r (m :: * -> *) a. ReaderT r m a -> r -> m a runReaderT (ReaderT r m a -> r -> m a) -> (ReaderCache r m a -> ReaderT r m a) -> ReaderCache r m a -> r -> m a forall b c a. (b -> c) -> (a -> b) -> a -> c . ReaderCache r m a -> ReaderT r m a forall c (m :: * -> *) a. ReaderCache c m a -> ReaderT c m a toReaderT
container :: Monad m => ReaderCache c m c {-# INLINE container #-} container :: ReaderCache c m c container = ReaderT c m c -> ReaderCache c m c forall c (m :: * -> *) a. ReaderT c m a -> ReaderCache c m a ReaderCache ReaderT c m c forall (m :: * -> *) r. Monad m => ReaderT r m r ask
instance PrimMonad m => PrimMonad (ReaderCache c m) where type PrimState (ReaderCache c m) = PrimState m primitive :: (State# (PrimState (ReaderCache c m)) -> (# State# (PrimState (ReaderCache c m)), a #)) -> ReaderCache c m a primitive = m a -> ReaderCache c m a forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (m a -> ReaderCache c m a) -> ((State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a) -> (State# (PrimState m) -> (# State# (PrimState m), a #)) -> ReaderCache c m a forall b c a. (b -> c) -> (a -> b) -> a -> c . (State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a forall (m :: * -> *) a. PrimMonad m => (State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a primitive
instance MArray IOArray e (ReaderCache c IO) where getBounds :: IOArray i e -> ReaderCache c IO (i, i) getBounds = IO (i, i) -> ReaderCache c IO (i, i) forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO (i, i) -> ReaderCache c IO (i, i)) -> (IOArray i e -> IO (i, i)) -> IOArray i e -> ReaderCache c IO (i, i) forall b c a. (b -> c) -> (a -> b) -> a -> c . IOArray i e -> IO (i, i) forall (a :: * -> * -> *) e (m :: * -> ) i. (MArray a e m, Ix i) => a i e -> m (i, i) getBounds getNumElements :: IOArray i e -> ReaderCache c IO Int getNumElements = IO Int -> ReaderCache c IO Int forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO Int -> ReaderCache c IO Int) -> (IOArray i e -> IO Int) -> IOArray i e -> ReaderCache c IO Int forall b c a. (b -> c) -> (a -> b) -> a -> c . IOArray i e -> IO Int forall (a :: * -> * -> *) e (m :: * -> ) i. (MArray a e m, Ix i) => a i e -> m Int getNumElements newArray :: (i, i) -> e -> ReaderCache c IO (IOArray i e) newArray (i, i) a = IO (IOArray i e) -> ReaderCache c IO (IOArray i e) forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO (IOArray i e) -> ReaderCache c IO (IOArray i e)) -> (e -> IO (IOArray i e)) -> e -> ReaderCache c IO (IOArray i e) forall b c a. (b -> c) -> (a -> b) -> a -> c . (i, i) -> e -> IO (IOArray i e) forall (a :: * -> * -> *) e (m :: * -> ) i. (MArray a e m, Ix i) => (i, i) -> e -> m (a i e) newArray (i, i) a unsafeRead :: IOArray i e -> Int -> ReaderCache c IO e unsafeRead IOArray i e a = IO e -> ReaderCache c IO e forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO e -> ReaderCache c IO e) -> (Int -> IO e) -> Int -> ReaderCache c IO e forall b c a. (b -> c) -> (a -> b) -> a -> c . IOArray i e -> Int -> IO e forall (a :: * -> * -> *) e (m :: * -> ) i. (MArray a e m, Ix i) => a i e -> Int -> m e unsafeRead IOArray i e a unsafeWrite :: IOArray i e -> Int -> e -> ReaderCache c IO () unsafeWrite IOArray i e a Int i = IO () -> ReaderCache c IO () forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ReaderCache c IO ()) -> (e -> IO ()) -> e -> ReaderCache c IO () forall b c a. (b -> c) -> (a -> b) -> a -> c . IOArray i e -> Int -> e -> IO () forall (a :: * -> * -> *) e (m :: * -> *) i. (MArray a e m, Ix i) => a i e -> Int -> e -> m () unsafeWrite IOArray i e a Int i
instance MArray IOUArray e IO => MArray IOUArray e (ReaderCache c IO) where getBounds :: IOUArray i e -> ReaderCache c IO (i, i) getBounds = IO (i, i) -> ReaderCache c IO (i, i) forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO (i, i) -> ReaderCache c IO (i, i)) -> (IOUArray i e -> IO (i, i)) -> IOUArray i e -> ReaderCache c IO (i, i) forall b c a. (b -> c) -> (a -> b) -> a -> c . IOUArray i e -> IO (i, i) forall (a :: * -> * -> *) e (m :: * -> ) i. (MArray a e m, Ix i) => a i e -> m (i, i) getBounds getNumElements :: IOUArray i e -> ReaderCache c IO Int getNumElements = IO Int -> ReaderCache c IO Int forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO Int -> ReaderCache c IO Int) -> (IOUArray i e -> IO Int) -> IOUArray i e -> ReaderCache c IO Int forall b c a. (b -> c) -> (a -> b) -> a -> c . IOUArray i e -> IO Int forall (a :: * -> * -> *) e (m :: * -> ) i. (MArray a e m, Ix i) => a i e -> m Int getNumElements newArray :: (i, i) -> e -> ReaderCache c IO (IOUArray i e) newArray (i, i) a = IO (IOUArray i e) -> ReaderCache c IO (IOUArray i e) forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO (IOUArray i e) -> ReaderCache c IO (IOUArray i e)) -> (e -> IO (IOUArray i e)) -> e -> ReaderCache c IO (IOUArray i e) forall b c a. (b -> c) -> (a -> b) -> a -> c . (i, i) -> e -> IO (IOUArray i e) forall (a :: * -> * -> *) e (m :: * -> ) i. (MArray a e m, Ix i) => (i, i) -> e -> m (a i e) newArray (i, i) a unsafeRead :: IOUArray i e -> Int -> ReaderCache c IO e unsafeRead IOUArray i e a = IO e -> ReaderCache c IO e forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO e -> ReaderCache c IO e) -> (Int -> IO e) -> Int -> ReaderCache c IO e forall b c a. (b -> c) -> (a -> b) -> a -> c . IOUArray i e -> Int -> IO e forall (a :: * -> * -> *) e (m :: * -> ) i. (MArray a e m, Ix i) => a i e -> Int -> m e unsafeRead IOUArray i e a unsafeWrite :: IOUArray i e -> Int -> e -> ReaderCache c IO () unsafeWrite IOUArray i e a Int i = IO () -> ReaderCache c IO () forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ReaderCache c IO ()) -> (e -> IO ()) -> e -> ReaderCache c IO () forall b c a. (b -> c) -> (a -> b) -> a -> c . IOUArray i e -> Int -> e -> IO () forall (a :: * -> * -> *) e (m :: * -> *) i. (MArray a e m, Ix i) => a i e -> Int -> e -> m () unsafeWrite IOUArray i e a Int i
instance MArray (STArray s) e (ReaderCache c (ST s)) where getBounds :: STArray s i e -> ReaderCache c (ST s) (i, i) getBounds = ST s (i, i) -> ReaderCache c (ST s) (i, i) forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (ST s (i, i) -> ReaderCache c (ST s) (i, i)) -> (STArray s i e -> ST s (i, i)) -> STArray s i e -> ReaderCache c (ST s) (i, i) forall b c a. (b -> c) -> (a -> b) -> a -> c . STArray s i e -> ST s (i, i) forall (a :: * -> * -> *) e (m :: * -> ) i. (MArray a e m, Ix i) => a i e -> m (i, i) getBounds getNumElements :: STArray s i e -> ReaderCache c (ST s) Int getNumElements = ST s Int -> ReaderCache c (ST s) Int forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (ST s Int -> ReaderCache c (ST s) Int) -> (STArray s i e -> ST s Int) -> STArray s i e -> ReaderCache c (ST s) Int forall b c a. (b -> c) -> (a -> b) -> a -> c . STArray s i e -> ST s Int forall (a :: * -> * -> *) e (m :: * -> ) i. (MArray a e m, Ix i) => a i e -> m Int getNumElements newArray :: (i, i) -> e -> ReaderCache c (ST s) (STArray s i e) newArray (i, i) a = ST s (STArray s i e) -> ReaderCache c (ST s) (STArray s i e) forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (ST s (STArray s i e) -> ReaderCache c (ST s) (STArray s i e)) -> (e -> ST s (STArray s i e)) -> e -> ReaderCache c (ST s) (STArray s i e) forall b c a. (b -> c) -> (a -> b) -> a -> c . (i, i) -> e -> ST s (STArray s i e) forall (a :: * -> * -> *) e (m :: * -> ) i. (MArray a e m, Ix i) => (i, i) -> e -> m (a i e) newArray (i, i) a unsafeRead :: STArray s i e -> Int -> ReaderCache c (ST s) e unsafeRead STArray s i e a = ST s e -> ReaderCache c (ST s) e forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (ST s e -> ReaderCache c (ST s) e) -> (Int -> ST s e) -> Int -> ReaderCache c (ST s) e forall b c a. (b -> c) -> (a -> b) -> a -> c . STArray s i e -> Int -> ST s e forall (a :: * -> * -> *) e (m :: * -> ) i. (MArray a e m, Ix i) => a i e -> Int -> m e unsafeRead STArray s i e a unsafeWrite :: STArray s i e -> Int -> e -> ReaderCache c (ST s) () unsafeWrite STArray s i e a Int i = ST s () -> ReaderCache c (ST s) () forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (ST s () -> ReaderCache c (ST s) ()) -> (e -> ST s ()) -> e -> ReaderCache c (ST s) () forall b c a. (b -> c) -> (a -> b) -> a -> c . STArray s i e -> Int -> e -> ST s () forall (a :: * -> * -> *) e (m :: * -> *) i. (MArray a e m, Ix i) => a i e -> Int -> e -> m () unsafeWrite STArray s i e a Int i
instance MArray (STUArray s) e (ST s) => MArray (STUArray s) e (ReaderCache c (ST s)) where getBounds :: STUArray s i e -> ReaderCache c (ST s) (i, i) getBounds = ST s (i, i) -> ReaderCache c (ST s) (i, i) forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (ST s (i, i) -> ReaderCache c (ST s) (i, i)) -> (STUArray s i e -> ST s (i, i)) -> STUArray s i e -> ReaderCache c (ST s) (i, i) forall b c a. (b -> c) -> (a -> b) -> a -> c . STUArray s i e -> ST s (i, i) forall (a :: * -> * -> *) e (m :: * -> ) i. (MArray a e m, Ix i) => a i e -> m (i, i) getBounds getNumElements :: STUArray s i e -> ReaderCache c (ST s) Int getNumElements = ST s Int -> ReaderCache c (ST s) Int forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (ST s Int -> ReaderCache c (ST s) Int) -> (STUArray s i e -> ST s Int) -> STUArray s i e -> ReaderCache c (ST s) Int forall b c a. (b -> c) -> (a -> b) -> a -> c . STUArray s i e -> ST s Int forall (a :: * -> * -> *) e (m :: * -> ) i. (MArray a e m, Ix i) => a i e -> m Int getNumElements newArray :: (i, i) -> e -> ReaderCache c (ST s) (STUArray s i e) newArray (i, i) a = ST s (STUArray s i e) -> ReaderCache c (ST s) (STUArray s i e) forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (ST s (STUArray s i e) -> ReaderCache c (ST s) (STUArray s i e)) -> (e -> ST s (STUArray s i e)) -> e -> ReaderCache c (ST s) (STUArray s i e) forall b c a. (b -> c) -> (a -> b) -> a -> c . (i, i) -> e -> ST s (STUArray s i e) forall (a :: * -> * -> *) e (m :: * -> ) i. (MArray a e m, Ix i) => (i, i) -> e -> m (a i e) newArray (i, i) a unsafeRead :: STUArray s i e -> Int -> ReaderCache c (ST s) e unsafeRead STUArray s i e a = ST s e -> ReaderCache c (ST s) e forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (ST s e -> ReaderCache c (ST s) e) -> (Int -> ST s e) -> Int -> ReaderCache c (ST s) e forall b c a. (b -> c) -> (a -> b) -> a -> c . STUArray s i e -> Int -> ST s e forall (a :: * -> * -> *) e (m :: * -> ) i. (MArray a e m, Ix i) => a i e -> Int -> m e unsafeRead STUArray s i e a unsafeWrite :: STUArray s i e -> Int -> e -> ReaderCache c (ST s) () unsafeWrite STUArray s i e a Int i = ST s () -> ReaderCache c (ST s) () forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (ST s () -> ReaderCache c (ST s) ()) -> (e -> ST s ()) -> e -> ReaderCache c (ST s) () forall b c a. (b -> c) -> (a -> b) -> a -> c . STUArray s i e -> Int -> e -> ST s () forall (a :: * -> * -> *) e (m :: * -> *) i. (MArray a e m, Ix i) => a i e -> Int -> e -> m () unsafeWrite STUArray s i e a Int i