Legend:
Library
Module
Module type
Parameter
Class
Class type
This module generates Client modules from RPC declarations.
The implementation of the module as a whole is unused. However, the namespace comes from the interface description, and hence calling implement is important.
The result of declaring a function of type 'a (where for example 'a might be (int -> string -> (bool, err) result)), is a function that takes an rpc function, which might send the RPC across the network, and returns a function of type 'a, in this case (int -> string -> (bool, err) result).
Our functions return a Result.result type, which contains the result of the Rpc, which might be an error message indicating a problem happening on the remote end.
The implementation is dependent on the module, and represents the 'result' of the entire module. For example, in the Server module, the `implementation` is the server function, with type
Rpc.call -> Rpc.response.
For the Client module, the individual declarations are used to perform the RPCs, and the 'implementation' type is simply unit.
'a res is the result type of declaring a function. For example, the Client module, given an (int -> int -> int) fn, will return a function of type 'a - in this case, (int -> int -> int)
type('a, 'b) comp = ('a, 'b)Result.result
This is for inserting a type in between the function application and its result. For example, this could be an Lwt.t, meaning that the result of a function application is a thread
declare name description typ is how an RPC is declared to the module implementing the functionality. The return type is dependent upon the module being used