module DDC.Core.Flow.Process.Process ( Process (..) , typeOfProcess) where import DDC.Core.Flow.Process.Operator import DDC.Core.Flow.Compounds import DDC.Core.Flow.Context import DDC.Core.Flow.Prim import DDC.Core.Flow.Exp -- | A process is a graph of series operators that read from some parameter -- series and write to some accumulators. data Process = Process { -- | Name of whole process. -- This is taken from the function name in the original -- source code. processName :: Name -- | Type parameters to process. -- These are the type parameters of the original function. , processParamTypes :: [BindF] -- | Value parameters to process. -- These are the value parameters of the original function. , processParamValues :: [BindF] -- | Flow contexts in this process. -- This contains a ContextRate entry for all the Rate variables -- in the parameters, along with an entry for all the nested -- contexts introduced by the process itself. , processContexts :: [Context] -- | Flow operators in this process. , processOperators :: [Operator] } -- | Take the functional type of a process. typeOfProcess :: Process -> TypeF typeOfProcess process = let tBody = foldr tFun tProcess $ map typeOfBind (processParamValues process) tQuant = foldr TForall tBody $ processParamTypes process in tQuant