-- {-# LANGUAGE #-}
{-# OPTIONS_GHC -Wall #-}
----------------------------------------------------------------------
-- |
-- Module      :  Data.NameM
-- Copyright   :  (c) Conal Elliott 2009
-- License     :  AGPLv3
-- 
-- Maintainer  :  conal@conal.net
-- Stability   :  experimental
-- 
-- Name supply monad.  Non-abstract synonym for @State [String]@
----------------------------------------------------------------------

module Data.NameM (NameM, genName, runNameM, allNames) where

import Control.Monad.State

type NameM = State [String]

-- Generate a new variable name
genName :: State [x] x
genName = do x:xs' <- get
             put xs'
             return x

runNameM :: NameM a -> a
runNameM m = evalState m allNames

allNames :: [String]
allNames = map reverse (tail names)
 where
   names = "" : [ c:cs | cs <- names , c <- ['a' .. 'z'] ]