forsyde-deep-0.2.0: src/ForSyDe/Deep/Process/ProcVal.hs
{-# LANGUAGE ScopedTypeVariables #-}
----------------------------------------------------------------------------
-- |
-- Module : ForSyDe.Deep.Process.ProcVal
-- Copyright : (c) ES Group, KTH/ICT/ES 2007-2013
-- License : BSD-style (see the file LICENSE)
--
-- Maintainer : forsyde-dev@ict.kth.se
-- Stability : experimental
-- Portability : non-portable (Template Haskell)
--
-- This module provides a type ('ProcVal') to store the value arguments passed
-- to process constructors.
--
-----------------------------------------------------------------------------
module ForSyDe.Deep.Process.ProcVal where
import ForSyDe.Deep.Process.ProcType
import Data.Typeable (typeRep)
import Data.Dynamic (toDyn, Dynamic)
import Data.Set
import Data.Proxy
import Language.Haskell.TH (Exp, runQ)
import Language.Haskell.TH.Syntax (Lift(..))
import System.IO.Unsafe (unsafePerformIO)
import Data.Typeable.FSDTypeRepLib (fsdTy, FSDTypeRep)
data ProcVal = ProcVal
{dyn :: Dynamic, -- Dynamic value
valAST :: ProcValAST} -- its AST
data ProcValAST = ProcValAST
{expVal :: Exp, -- Its AST representation
expTyp :: FSDTypeRep, -- Type of the expression
expEnums :: Set EnumAlgTy} -- Enumerated types associated
-- with the expression
-- | 'ProcVal' constructor
mkProcVal :: (Lift a, ProcType a) => a -> ProcVal
-- FIXME: would unsafePerformIO cause any harm to get the exp out of the
-- Q monad in this context?
mkProcVal val = ProcVal (toDyn val) (mkProcValAST val)
mkProcValAST :: (Lift a, ProcType a) => a -> ProcValAST
-- FIMXE: the unsafePerformIO won't be needed once the Data a => Lift a
-- instance is created
mkProcValAST (val :: x) = ProcValAST (unsafePerformIO.runQ.lift $ val)
(fsdTy.typeRep $ (Proxy :: Proxy x))
(getEnums val)