packages feed

cao-0.1: src/Language/CAO/Common/Fresh.hs

{-# LANGUAGE FlexibleContexts #-}
{-
Module      :  $Header$
Description :  Generation of new simbols.
Copyright   :  (c) SMART Team / HASLab
License     :  GPL

Maintainer  :  Paulo Silva <paufil@di.uminho.pt>
Stability   :  experimental
Portability :  non-portable

-}

module Language.CAO.Common.Fresh 
    ( freshVar -- Indist, Simplify, Target
    , freshVar' -- PreC
    , freshSFld -- PreC
    , freshTmpVar -- Target, PreC, C
    , freshIndex -- Simplify
    , freshSmb -- C, PreC
    ) where

import Language.CAO.Common.Monad
import Language.CAO.Common.State
import Language.CAO.Common.Var

import Language.CAO.Type

freshSmb        :: CaoM e w s m => m (Int, String)
freshSmb = do
    i <- uniqId
    return (i, 't' : show i)

freshVar :: CaoM e w s m => Scope -> Type Var -> m Var
freshVar s t = do
    (i, n) <- freshSmb
    return $ mkVar s (mkVarName n) i t
    where 
    mkVar Global = mkGId
    mkVar Local  = mkLId

freshVar' :: CaoM e w s m => Scope -> String -> Type Var -> m Var
freshVar' s n t = do
    i <- uniqId
    return $ mkVar s (mkVarName n) i t
    where 
    mkVar Global = mkGId
    mkVar Local  = mkLId

freshSFld :: CaoM e w s m => String -> Type Var -> m Var
freshSFld n t = do
    i <- uniqId
    return $ mkGId (mkVarName n) i t

freshIndex :: CaoM e w s m => Scope -> Type Var -> m Var
freshIndex s t = do
    (i, n) <- freshSmb
    return $ mkVar s (mkVarName n) i t Nothing
    where
    mkVar Global = mkGConst
    mkVar Local  = mkLConst

-- Temporary variables obtained using this function, 
-- should be stored in the temporary variable pool after
-- being used.
freshTmpVar :: CaoM e w CaoState m => Type Var -> m Var
freshTmpVar typ = tmpFromPool typ >>= 
    maybe (freshVar Local typ) return