purescript-0.10.2: src/Control/Monad/Supply/Class.hs
-- |
-- 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