module Fresh
  ( fresh
  , evalFresh
  , Fresh
  , FreshT
  ) where

import Protolude

type FreshT m a = StateT Int m a
type Fresh a = FreshT Identity a

evalFresh :: Fresh a -> a
evalFresh act = runIdentity $ evalStateT act 0

fresh :: Fresh Int
fresh = do
  v <- get
  modify (+ 1)
  pure v