module Control.Distributed.Process.Internal.Closure.Resolution (resolveClosure) where
import Data.Accessor ((^.))
import Data.ByteString.Lazy (ByteString)
import Control.Distributed.Process.Internal.Types
( RemoteTable
, remoteTableLabel
, Static(Static)
, StaticLabel(..)
)
import Control.Distributed.Process.Internal.Dynamic
( Dynamic(Dynamic)
, toDyn
, dynApply
, unsafeCoerce#
)
import Control.Distributed.Process.Internal.TypeRep ()
resolveStatic :: RemoteTable -> StaticLabel -> Maybe Dynamic
resolveStatic rtable (StaticLabel string typ) = do
Dynamic _ val <- rtable ^. remoteTableLabel string
return (Dynamic typ val)
resolveStatic rtable (StaticApply static1 static2) = do
f <- resolveStatic rtable static1
x <- resolveStatic rtable static2
f `dynApply` x
resolveStatic _rtable (StaticDuplicate static typ) =
return $ Dynamic typ (unsafeCoerce# (Static static))
resolveClosure :: RemoteTable -> StaticLabel -> ByteString -> Maybe Dynamic
resolveClosure rtable static env = do
decoder <- resolveStatic rtable static
decoder `dynApply` toDyn env