module Language.CIRC.Runtime
( CIRC
, evalCIRC
, runCIRC
, Id
, newId
, idId
) where
import Control.Monad.State
type CIRC = State (Int, [(String, Int)])
evalCIRC :: CIRC a -> Int -> a
evalCIRC a i = evalState a (i, [])
runCIRC :: CIRC a -> Int -> (a, Int)
runCIRC a i = (b, j)
where
(b, (j, _)) = runState a (i, [])
type Id = String
newId :: CIRC Id
newId = do
(i, table) <- get
put (i + 1, table)
return $ "__" ++ show i
idId :: Id -> CIRC Int
idId name = do
(i, table) <- get
case lookup name table of
Nothing -> do
put (i + 1, (name, i) : table)
return i
Just i -> return i