%
% Copyright (C) 1997 Thomas Nordin and Alastair Reid
%
\begin{code}
module NameSupply
( NameSupply
, NSM
, getNewName
, getNewNames
, initNS
, nameSupply
) where
import Name( Name )
#if !defined(__HASKELL98__)
#define fmap map
#endif
\end{code}
%************************************************************************
%* *
\subsection{Monadic plumbing for Name Supply}
%* *
%************************************************************************
\begin{code}
type NameSupply = [Name]
newtype NSM a = NSM (NameSupply -> (a, NameSupply))
instance Functor NSM where
fmap f (NSM g) = NSM (\ns -> let (a, ns') = g ns
in (f a, ns'))
instance Monad NSM where
(NSM f) >>= g =
NSM (\ns -> let (result1, ns1) = f ns
(NSM h) = g result1
in h ns1)
return a = NSM (\ns -> (a, ns))
getNewNames :: Int -> NSM [Name]
getNewNames i = NSM (\ns -> splitAt i ns)
getNewName :: NSM Name
getNewName = NSM (\ns -> (head ns, tail ns))
initNS :: NSM a -> NameSupply -> (a, NameSupply)
initNS (NSM f) ns = f ns
-- A good source of names, functions depend on this particular
-- implementations so don't change unless you know what you are doing.
nameSupply :: Name -> NameSupply
nameSupply foo = [foo ++ show n | n <- [1..]]
\end{code}
|