(* $Id: netplex_encap.mli 1416 2010-02-16 00:25:07Z gerd $ *)
(** Type-safe marshalling between processes of the same executable *)
(** This is a pragmatic approach to type-safe marshalling. We define
[type encap] as an arbitrary value that carries a type identifier with it.
The type identifier is generated when the functor
{!Netplex_encap.Make_encap} is applied. Every instantiation of this
functor generates a new type identifier.
The idea is then that an [encap] value can be marshalled to another
process using [Marshal], and when it is unwrapped the type identifier
is checked. Unwrapping is only successful when the [unwrap] function
from the same functor instantiation is used as the [wrap]
function.
This module is incompatible with:
- Marshalling to processes running a different executable
- Marshalling to processes that are dynamically loading
modules
- The functor must be instantiated at program initialization time.
Especially this must not happen in [let module] expressions.
Only some of these assumptions can be checked at runtime by this
implementation.
*)
exception Type_mismatch
(** Raised when an encapulated type is tried to be unwrapped by the
wrong encapsulation module
*)
type encap
(** An encapsulated value with a type identifier *)
module type TYPE = sig type t end
(** Just a (monomorphic) type [t] *)
module type ENCAP = sig
type t
val wrap : t -> encap
val unwrap : encap -> t
(** Raises {!Netplex_encap.Type_mismatch} if the value does not fit *)
end
module Make_encap(T:TYPE) : ENCAP with type t = T.t
(** Create an encapsulation module *)