module Language.Java.Paragon.TypeCheck.Uniq ( Uniq, initUniq, getUniq, newAlias, newFresh ) where import Data.IORef import Language.Java.Paragon.TypeCheck.Actors newtype Uniq = Uniq (IORef Int) initUniq :: IO Uniq initUniq = newIORef 0 >>= return . Uniq getUniq :: Uniq -> IO Int getUniq (Uniq u) = do i <- readIORef u writeIORef u (i+1) return i newAlias :: Uniq -> IO ActorId newAlias u = do uniq <- getUniq u return $ Alias uniq newFresh :: Uniq -> IO ActorId newFresh u = do uniq <- getUniq u return $ Fresh uniq