{-# LANGUAGE UndecidableInstances #-}
module Futhark.MonadFreshNames
( MonadFreshNames (..),
modifyNameSource,
newName,
newVName,
newIdent,
newIdent',
newParam,
module Futhark.FreshNames,
)
where
import Control.Monad.Except
import Control.Monad.RWS.Lazy qualified
import Control.Monad.RWS.Strict qualified
import Control.Monad.Reader
import Control.Monad.State.Lazy qualified
import Control.Monad.State.Strict qualified
import Control.Monad.Trans.Maybe qualified
import Control.Monad.Writer.Lazy qualified
import Control.Monad.Writer.Strict qualified
import Futhark.FreshNames hiding (newName)
import Futhark.FreshNames qualified as FreshNames
import Futhark.IR.Syntax
class (Monad m) => MonadFreshNames m where
getNameSource :: m VNameSource
putNameSource :: VNameSource -> m ()
instance (Monad im) => MonadFreshNames (Control.Monad.State.Lazy.StateT VNameSource im) where
getNameSource :: StateT VNameSource im VNameSource
getNameSource = StateT VNameSource im VNameSource
forall s (m :: * -> *). MonadState s m => m s
Control.Monad.State.Lazy.get
putNameSource :: VNameSource -> StateT VNameSource im ()
putNameSource = VNameSource -> StateT VNameSource im ()
forall s (m :: * -> *). MonadState s m => s -> m ()
Control.Monad.State.Lazy.put
instance (Monad im) => MonadFreshNames (Control.Monad.State.Strict.StateT VNameSource im) where
getNameSource :: StateT VNameSource im VNameSource
getNameSource = StateT VNameSource im VNameSource
forall s (m :: * -> *). MonadState s m => m s
Control.Monad.State.Strict.get
putNameSource :: VNameSource -> StateT VNameSource im ()
putNameSource = VNameSource -> StateT VNameSource im ()
forall s (m :: * -> *). MonadState s m => s -> m ()
Control.Monad.State.Strict.put
instance
(Monad im, Monoid w) =>
MonadFreshNames (Control.Monad.RWS.Lazy.RWST r w VNameSource im)
where
getNameSource :: RWST r w VNameSource im VNameSource
getNameSource = RWST r w VNameSource im VNameSource
forall s (m :: * -> *). MonadState s m => m s
Control.Monad.RWS.Lazy.get
putNameSource :: VNameSource -> RWST r w VNameSource im ()
putNameSource = VNameSource -> RWST r w VNameSource im ()
forall s (m :: * -> *). MonadState s m => s -> m ()
Control.Monad.RWS.Lazy.put
instance
(Monad im, Monoid w) =>
MonadFreshNames (Control.Monad.RWS.Strict.RWST r w VNameSource im)
where
getNameSource :: RWST r w VNameSource im VNameSource
getNameSource = RWST r w VNameSource im VNameSource
forall s (m :: * -> *). MonadState s m => m s
Control.Monad.RWS.Strict.get
putNameSource :: VNameSource -> RWST r w VNameSource im ()
putNameSource = VNameSource -> RWST r w VNameSource im ()
forall s (m :: * -> *). MonadState s m => s -> m ()
Control.Monad.RWS.Strict.put
modifyNameSource :: (MonadFreshNames m) => (VNameSource -> (a, VNameSource)) -> m a
modifyNameSource :: forall (m :: * -> *) a.
MonadFreshNames m =>
(VNameSource -> (a, VNameSource)) -> m a
modifyNameSource VNameSource -> (a, VNameSource)
m = do
VNameSource
src <- m VNameSource
forall (m :: * -> *). MonadFreshNames m => m VNameSource
getNameSource
let (a
x, VNameSource
src') = VNameSource -> (a, VNameSource)
m VNameSource
src
VNameSource
src' VNameSource -> m () -> m ()
forall a b. a -> b -> b
`seq` VNameSource -> m ()
forall (m :: * -> *). MonadFreshNames m => VNameSource -> m ()
putNameSource VNameSource
src'
a -> m a
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
x
newName :: (MonadFreshNames m) => VName -> m VName
newName :: forall (m :: * -> *). MonadFreshNames m => VName -> m VName
newName = (VNameSource -> (VName, VNameSource)) -> m VName
forall (m :: * -> *) a.
MonadFreshNames m =>
(VNameSource -> (a, VNameSource)) -> m a
modifyNameSource ((VNameSource -> (VName, VNameSource)) -> m VName)
-> (VName -> VNameSource -> (VName, VNameSource))
-> VName
-> m VName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (VNameSource -> VName -> (VName, VNameSource))
-> VName -> VNameSource -> (VName, VNameSource)
forall a b c. (a -> b -> c) -> b -> a -> c
flip VNameSource -> VName -> (VName, VNameSource)
FreshNames.newName
newVName :: (MonadFreshNames m) => Name -> m VName
newVName :: forall (m :: * -> *). MonadFreshNames m => Name -> m VName
newVName Name
s = VName -> m VName
forall (m :: * -> *). MonadFreshNames m => VName -> m VName
newName (VName -> m VName) -> VName -> m VName
forall a b. (a -> b) -> a -> b
$ Name -> Int -> VName
VName Name
s Int
0
newIdent ::
(MonadFreshNames m) => Name -> Type -> m Ident
newIdent :: forall (m :: * -> *). MonadFreshNames m => Name -> Type -> m Ident
newIdent Name
s Type
t = VName -> Type -> Ident
Ident (VName -> Type -> Ident) -> m VName -> m (Type -> Ident)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Name -> m VName
forall (m :: * -> *). MonadFreshNames m => Name -> m VName
newVName Name
s m (Type -> Ident) -> m Type -> m Ident
forall a b. m (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Type -> m Type
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Type
t
newIdent' ::
(MonadFreshNames m) =>
(Name -> Name) ->
Ident ->
m Ident
newIdent' :: forall (m :: * -> *).
MonadFreshNames m =>
(Name -> Name) -> Ident -> m Ident
newIdent' Name -> Name
f Ident
ident =
Name -> Type -> m Ident
forall (m :: * -> *). MonadFreshNames m => Name -> Type -> m Ident
newIdent
(Name -> Name
f (Name -> Name) -> Name -> Name
forall a b. (a -> b) -> a -> b
$ VName -> Name
baseName (VName -> Name) -> VName -> Name
forall a b. (a -> b) -> a -> b
$ Ident -> VName
identName Ident
ident)
(Ident -> Type
identType Ident
ident)
newParam ::
(MonadFreshNames m) =>
Name ->
dec ->
m (Param dec)
newParam :: forall (m :: * -> *) dec.
MonadFreshNames m =>
Name -> dec -> m (Param dec)
newParam Name
s dec
t = Attrs -> VName -> dec -> Param dec
forall dec. Attrs -> VName -> dec -> Param dec
Param Attrs
forall a. Monoid a => a
mempty (VName -> dec -> Param dec) -> m VName -> m (dec -> Param dec)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Name -> m VName
forall (m :: * -> *). MonadFreshNames m => Name -> m VName
newVName Name
s m (dec -> Param dec) -> m dec -> m (Param dec)
forall a b. m (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> dec -> m dec
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure dec
t
instance (MonadFreshNames m) => MonadFreshNames (ReaderT s m) where
getNameSource :: ReaderT s m VNameSource
getNameSource = m VNameSource -> ReaderT s m VNameSource
forall (m :: * -> *) a. Monad m => m a -> ReaderT s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m VNameSource
forall (m :: * -> *). MonadFreshNames m => m VNameSource
getNameSource
putNameSource :: VNameSource -> ReaderT s m ()
putNameSource = m () -> ReaderT s m ()
forall (m :: * -> *) a. Monad m => m a -> ReaderT s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> ReaderT s m ())
-> (VNameSource -> m ()) -> VNameSource -> ReaderT s m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VNameSource -> m ()
forall (m :: * -> *). MonadFreshNames m => VNameSource -> m ()
putNameSource
instance
(MonadFreshNames m, Monoid s) =>
MonadFreshNames (Control.Monad.Writer.Lazy.WriterT s m)
where
getNameSource :: WriterT s m VNameSource
getNameSource = m VNameSource -> WriterT s m VNameSource
forall (m :: * -> *) a. Monad m => m a -> WriterT s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m VNameSource
forall (m :: * -> *). MonadFreshNames m => m VNameSource
getNameSource
putNameSource :: VNameSource -> WriterT s m ()
putNameSource = m () -> WriterT s m ()
forall (m :: * -> *) a. Monad m => m a -> WriterT s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> WriterT s m ())
-> (VNameSource -> m ()) -> VNameSource -> WriterT s m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VNameSource -> m ()
forall (m :: * -> *). MonadFreshNames m => VNameSource -> m ()
putNameSource
instance
(MonadFreshNames m, Monoid s) =>
MonadFreshNames (Control.Monad.Writer.Strict.WriterT s m)
where
getNameSource :: WriterT s m VNameSource
getNameSource = m VNameSource -> WriterT s m VNameSource
forall (m :: * -> *) a. Monad m => m a -> WriterT s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m VNameSource
forall (m :: * -> *). MonadFreshNames m => m VNameSource
getNameSource
putNameSource :: VNameSource -> WriterT s m ()
putNameSource = m () -> WriterT s m ()
forall (m :: * -> *) a. Monad m => m a -> WriterT s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> WriterT s m ())
-> (VNameSource -> m ()) -> VNameSource -> WriterT s m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VNameSource -> m ()
forall (m :: * -> *). MonadFreshNames m => VNameSource -> m ()
putNameSource
instance
(MonadFreshNames m) =>
MonadFreshNames (Control.Monad.Trans.Maybe.MaybeT m)
where
getNameSource :: MaybeT m VNameSource
getNameSource = m VNameSource -> MaybeT m VNameSource
forall (m :: * -> *) a. Monad m => m a -> MaybeT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m VNameSource
forall (m :: * -> *). MonadFreshNames m => m VNameSource
getNameSource
putNameSource :: VNameSource -> MaybeT m ()
putNameSource = m () -> MaybeT m ()
forall (m :: * -> *) a. Monad m => m a -> MaybeT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> MaybeT m ())
-> (VNameSource -> m ()) -> VNameSource -> MaybeT m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VNameSource -> m ()
forall (m :: * -> *). MonadFreshNames m => VNameSource -> m ()
putNameSource
instance
(MonadFreshNames m) =>
MonadFreshNames (ExceptT e m)
where
getNameSource :: ExceptT e m VNameSource
getNameSource = m VNameSource -> ExceptT e m VNameSource
forall (m :: * -> *) a. Monad m => m a -> ExceptT e m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m VNameSource
forall (m :: * -> *). MonadFreshNames m => m VNameSource
getNameSource
putNameSource :: VNameSource -> ExceptT e m ()
putNameSource = m () -> ExceptT e m ()
forall (m :: * -> *) a. Monad m => m a -> ExceptT e m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> ExceptT e m ())
-> (VNameSource -> m ()) -> VNameSource -> ExceptT e m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VNameSource -> m ()
forall (m :: * -> *). MonadFreshNames m => VNameSource -> m ()
putNameSource