content: {-# 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
  
  