Legend:
Library
Module
Module type
Parameter
Class
Class type
Library
Module
Module type
Parameter
Class
Class type
module Mirage_protocol : sig ... end
The type for flows. A flow represents the state of a single reliable stream stream that is connected to an endpoint.
include Mirage_flow.S
with type flow := flow
and type error = [ `Msg of string | `Not_found | `Cycle ]
val pp_error : error Fmt.t
val pp_write_error : write_error Fmt.t
val write : flow -> Cstruct.t -> (unit, write_error) Stdlib.result Lwt.t
val writev : flow -> Cstruct.t list -> (unit, write_error) Stdlib.result Lwt.t
val close : flow -> unit Lwt.t
module Fun : sig ... end
val make : name:string -> 'edn value
make ~name
is a new witness.
replace w v ctx
replaces the value of w
by v
if it exists or bound w
to v
.
val empty : ctx
empty
is the empty context.
val register :
?priority:int ->
name:string ->
(module Mirage_protocol.S with type endpoint = 'edn and type flow = 'flow) ->
'edn value * ('edn, 'flow) protocol
register ?priority ~name (module Protocol)
registers the given Protocol
into the internal global Mimic's state as a possible transmission protocol available via resolve
.
?priority
is used to help mimic to choose between multiple solutions according to the given context. Mimic will choose the lower-priority solution.
name
helps the end-user to know which solution mimic will dynamically via log outputs.
register
returns 2 values:
module type REPR = sig ... end
repr protocol
gives a module definition with an OCaml constructor to help the end-user to destruct the structural type of a given flow
:
module Protocol
: Mirage_protocol.S with type flow = Lwt_unix.file_descr
let edn, protocol = Mimic.register ~name:"protocol" (module Protocol)
module R = (val (Mimic.repr protocol))
let () = Mimic.resolve ~ctx >>= function
| Ok (R.T lwt_unix_file_descr) -> ...
| ...
resolve ctx
tries to instantiate a flow
from the given ctx
.
equal a b
returns a proof that a
and b
are structurally equal.
unfold ctx
applies any functions available into the given ctx
and and possible to compute according to available values and return a list of what these functions return.
It's useful to do an introspection of what mimic
does when it resolve
s the given ctx
. From that and equal
, the user is able to introspect what mimic
generated and which protocol it is able to instantiate then.
al:resolve} is: {[ let resolve ctx = unfold ctx >>= function | Ok lst -> connect lst | Error _ as err -> Lwt.return err ]}