-- | -- A class for monads supporting a supply of fresh names -- {-# LANGUAGE DefaultSignatures #-} module Control.Monad.Supply.Class where import Prelude.Compat import Control.Monad.Supply import Control.Monad.State import Control.Monad.Writer class Monad m => MonadSupply m where fresh :: m Integer peek :: m Integer default fresh :: MonadTrans t => t m Integer fresh = lift fresh default peek :: MonadTrans t => t m Integer peek = lift peek instance Monad m => MonadSupply (SupplyT m) where fresh = SupplyT $ do n <- get put (n + 1) return n peek = SupplyT get instance MonadSupply m => MonadSupply (StateT s m) instance (Monoid w, MonadSupply m) => MonadSupply (WriterT w m) freshName :: MonadSupply m => m String freshName = fmap (('$' :) . show) fresh