remote-0.1: Remote/Closure.hs
{-# LANGUAGE DeriveDataTypeable #-}
-- | A simple type to represent a closure, that is, a function
-- and its environment. The current implementation represents
-- functions as strings, but this could be theoretically
-- swapped out for the \"static\" mechanism described in the
-- paper.
module Remote.Closure (
Closure(..)
) where
import Data.Binary (Binary,get,put)
import Data.Typeable (Typeable)
import Remote.Encoding (Payload)
-- | A data type representing a closure, that is, a function with its environment.
-- In spirit, this is actually:
--
-- > data Closure a where
-- > Closure :: Serializable v => Static (v -> a) -> v -> Closure a
--
-- where the Static type wraps a function with no non-static free variables.
-- We simulate this behavior by identifying top-level functions as strings.
-- See the paper for clarification.
data Closure a = Closure String Payload
deriving (Typeable)
instance Show (Closure a) where
show a = case a of
(Closure fn _pl) -> show fn
instance Binary (Closure a) where
get = do s <- get
v <- get
return $ Closure s v
put (Closure s v) = put s >> put v