module Copilot.Compile.C99.Util where
import Control.Monad.State
import Copilot.Core (Id)
import qualified Language.C99.Simple.AST as C
type FunEnv = ([C.Decln], [C.Ident])
statetell :: Monoid m => m -> State m ()
statetell m = modify ((flip mappend) m)
fresh :: String -> [String] -> String
fresh name used = head $ dropWhile (flip elem used) (name:freshnames) where
freshnames = (name ++).show <$> [0..]
names :: [C.Decln] -> [String]
names ds = map match ds where
match (C.VarDecln _ _ name _) = name
streamname :: Id -> String
streamname sid = "s" ++ show sid
indexname :: Id -> String
indexname sid = streamname sid ++ "_idx"
excpyname :: String -> String
excpyname name = name ++ "_cpy"
generatorname :: Id -> String
generatorname sid = streamname sid ++ "_gen"
guardname :: String -> String
guardname name = name ++ "_guard"
argname :: String -> Int -> String
argname name n = name ++ "_arg" ++ show n
argnames :: String -> [String]
argnames base = [aname | n <- [0..], let aname = argname base n]
funcall :: C.Ident -> [C.Expr] -> C.Expr
funcall name args = C.Funcall (C.Ident name) args