distributed-process-0.2.1: src/Control/Distributed/Process/Internal/Closure/MkClosure.hs
{-# LANGUAGE TemplateHaskell #-}
module Control.Distributed.Process.Internal.Closure.MkClosure (mkClosure) where
import Data.Binary (encode)
import Language.Haskell.TH (Q, Exp, Name)
import Control.Distributed.Process.Internal.Types (Closure(Closure))
import Control.Distributed.Process.Internal.Closure.TH
( mkStatic
, functionSDict
)
import Control.Distributed.Process.Internal.Closure.Static
( staticCompose
, staticDecode
)
-- | Create a closure
--
-- If @f : T1 -> T2@ is a /monomorphic/ function
-- then @$(mkClosure 'f) :: T1 -> Closure T2@.
-- Be sure to pass 'f' to 'remotable'.
mkClosure :: Name -> Q Exp
mkClosure n =
[| Closure ($(mkStatic n) `staticCompose` staticDecode $(functionSDict n))
. encode
|]