sig
  module Events : EVENTS
  module Event : EVENT
  module Cache :
    sig
      module Key :
        sig
          type t = Events.t
          val from_protobuf : Protobuf_capable.D.t -> t
          val to_protobuf : t -> Protobuf_capable.E.t -> unit
        end
      module Value :
        sig
          type t = Data.t
          val from_protobuf : Protobuf_capable.D.t -> t
          val to_protobuf : t -> Protobuf_capable.E.t -> unit
        end
      module Usermeta_value :
        sig
          type t = Cache.Default_usermeta.t
          val from_protobuf : Protobuf_capable.D.t -> t
          val to_protobuf : t -> Protobuf_capable.E.t -> unit
        end
      module Index_value :
        sig
          type t = Cache.Default_index.t
          val from_protobuf : Protobuf_capable.D.t -> t
          val to_protobuf : t -> Protobuf_capable.E.t -> unit
        end
      type conn = Conn.t
      type t =
        Cache.Make_with_usermeta_index(Events)(Data)(Cache.Default_usermeta)(Cache.Default_index).t = {
        conn : conn;
        bucket : string;
      }
      val get_conn : t -> conn
      val get_bucket : t -> string
      module Unsafe_Robj :
        sig
          module Link :
            sig
              type t =
                Cache.Make_with_usermeta_index(Events)(Data)(Cache.Default_usermeta)(Cache.Default_index).Unsafe_Robj.Link.t = {
                bucket : string option;
                key : string option;
                tag : string option;
              }
              val bucket : t -> string option
              val key : t -> string option
              val tag : t -> string option
              val from_protobuf : Protobuf_capable.D.t -> t
              val to_protobuf : t -> Protobuf_capable.E.t -> unit
            end
          module Pair :
            sig
              type t =
                Cache.Make_with_usermeta_index(Events)(Data)(Cache.Default_usermeta)(Cache.Default_index).Unsafe_Robj.Pair.t = {
                key : string;
                value : string option;
              }
              val create : k:string -> v:string option -> t
              val key : t -> string
              val value : t -> string option
              val set_key : string -> t -> t
              val set_value : string option -> t -> t
              val from_protobuf : Protobuf_capable.D.t -> t
              val to_protobuf : t -> Protobuf_capable.E.t -> unit
            end
          module Usermeta :
            sig
              type t =
                Cache.Make_with_usermeta_index(Events)(Data)(Cache.Default_usermeta)(Cache.Default_index).Unsafe_Robj.Usermeta.t = {
                key : string;
                value : string option;
              }
              val create : k:string -> v:string option -> t
              val key : t -> string
              val value : t -> string option
              val set_key : string -> t -> t
              val set_value : string option -> t -> t
              val from_protobuf : Protobuf_capable.D.t -> t
              val to_protobuf : t -> Protobuf_capable.E.t -> unit
            end
          module Index :
            sig
              type t =
                Cache.Make_with_usermeta_index(Events)(Data)(Cache.Default_usermeta)(Cache.Default_index).Unsafe_Robj.Index.t = {
                key : string;
                value : string option;
              }
              val create : k:string -> v:string option -> t
              val key : t -> string
              val value : t -> string option
              val set_key : string -> t -> t
              val set_value : string option -> t -> t
              val from_protobuf : Protobuf_capable.D.t -> t
              val to_protobuf : t -> Protobuf_capable.E.t -> unit
            end
          module Content :
            sig
              type t =
                Cache.Make_with_usermeta_index(Events)(Data)(Cache.Default_usermeta)(Cache.Default_index).Unsafe_Robj.Content.t = {
                value : string;
                content_type : string option;
                charset : string option;
                content_encoding : string option;
                vtag : string option;
                links : Link.t list;
                last_mod : Int32.t option;
                last_mod_usec : Int32.t option;
                usermeta : Usermeta.t list;
                indices : Index.t list;
                deleted : bool option;
              }
              val create : string -> t
              val value : t -> string
              val content_type : t -> string option
              val charset : t -> string option
              val content_encoding : t -> string option
              val vtag : t -> string option
              val links : t -> Link.t list
              val last_mod : t -> Int32.t option
              val last_mod_usec : t -> Int32.t option
              val usermeta : t -> Usermeta.t list
              val indices : t -> Index.t list
              val deleted : t -> bool
              val set_value : string -> t -> t
              val set_content_type : string option -> t -> t
              val set_charset : string option -> t -> t
              val set_content_encoding : string option -> t -> t
              val set_vtag : string option -> t -> t
              val set_links : Link.t list -> t -> t
              val set_last_mod : Int32.t option -> t -> t
              val set_last_mod_usec : Int32.t option -> t -> t
              val set_usermeta : Usermeta.t list -> t -> t
              val set_indices : Index.t list -> t -> t
              val from_protobuf : Protobuf_capable.D.t -> t
              val to_protobuf : t -> Protobuf_capable.E.t -> unit
            end
          type 'a t =
              'a
              Cache.Make_with_usermeta_index(Events)(Data)(Cache.Default_usermeta)(Cache.Default_index).Unsafe_Robj.t
          val of_pb :
            Content.t list ->
            string option -> bool option -> [ `Maybe_siblings ] t
          val create : Content.t -> [ `No_siblings ] t
          val of_value : string -> [ `No_siblings ] t
          val contents : 'a t -> Content.t list
          val content : [ `No_siblings ] t -> Content.t
          val vclock : 'a t -> string option
          val unchanged : 'a t -> bool
          val set_contents : Content.t list -> 'a t -> [ `Maybe_siblings ] t
          val set_content : Content.t -> 'a t -> [ `No_siblings ] t
          val set_vclock : string option -> 'a t -> 'a t
        end
      module Robj :
        sig
          module Link :
            sig
              type t =
                Cache.Make_with_usermeta_index(Events)(Data)(Cache.Default_usermeta)(Cache.Default_index).Robj.Link.t = {
                bucket : string option;
                key : Key.t option;
                tag : string option;
              }
              val bucket : t -> string option
              val key : t -> Key.t option
              val tag : t -> string option
              val set_bucket : string option -> t -> t
              val set_key : Key.t option -> t -> t
              val set_tag : string option -> t -> t
              val to_unsafe : t -> Unsafe_Robj.Link.t
              val from_unsafe : Unsafe_Robj.Link.t -> t
            end
          module type Unsafe_Pair =
            sig
              type t = { key : string; value : string option; }
              val value : t -> string option
              val key : t -> string
            end
          module Pair :
            functor (Unsafe : Unsafe_Pair) (V : Protobuf_capable.S->
              sig
                type t =
                  Cache.Make_with_usermeta_index(Events)(Data)(Cache.Default_usermeta)(Cache.Default_index).Robj.Pair(Unsafe)(V).t = {
                  key : Key.t;
                  value : V.t option;
                }
                val create : k:Key.t -> v:V.t option -> t
                val key : t -> Key.t
                val value : t -> V.t option
                val set_key : Key.t -> t -> t
                val set_value : V.t option -> t -> t
                val to_unsafe : t -> Unsafe.t
                val from_unsafe : Unsafe.t -> t
              end
          module Usermeta :
            sig
              type t =
                Pair(Unsafe_Robj.Usermeta)(Usermeta_value).t = {
                key : Key.t;
                value : Usermeta_value.t option;
              }
              val create : k:Key.t -> v:Usermeta_value.t option -> t
              val key : t -> Key.t
              val value : t -> Usermeta_value.t option
              val set_key : Key.t -> t -> t
              val set_value : Usermeta_value.t option -> t -> t
              val to_unsafe : t -> Unsafe_Robj.Usermeta.t
              val from_unsafe : Unsafe_Robj.Usermeta.t -> t
            end
          module Index :
            sig
              type t =
                Pair(Unsafe_Robj.Index)(Index_value).t = {
                key : Key.t;
                value : Index_value.t option;
              }
              val create : k:Key.t -> v:Index_value.t option -> t
              val key : t -> Key.t
              val value : t -> Index_value.t option
              val set_key : Key.t -> t -> t
              val set_value : Index_value.t option -> t -> t
              val to_unsafe : t -> Unsafe_Robj.Index.t
              val from_unsafe : Unsafe_Robj.Index.t -> t
            end
          module Content :
            sig
              type t =
                Cache.Make_with_usermeta_index(Events)(Data)(Cache.Default_usermeta)(Cache.Default_index).Robj.Content.t = {
                value : Value.t;
                content_type : string option;
                charset : string option;
                content_encoding : string option;
                vtag : string option;
                links : Link.t list;
                last_mod : Int32.t option;
                last_mod_usec : Int32.t option;
                usermeta : Usermeta.t list;
                indices : Index.t list;
                deleted : bool option;
              }
              val value : t -> Value.t
              val content_type : t -> string option
              val charset : t -> string option
              val content_encoding : t -> string option
              val vtag : t -> string option
              val links : t -> Link.t list
              val last_mod : t -> Int32.t option
              val last_mod_usec : t -> Int32.t option
              val usermeta : t -> Usermeta.t list
              val indices : t -> Index.t list
              val deleted : t -> bool
              val create : Value.t -> t
              val to_unsafe : t -> Unsafe_Robj.Content.t
              val from_unsafe : Unsafe_Robj.Content.t -> t
              val set_value : Value.t -> t -> t
              val set_content_type : string option -> t -> t
              val set_charset : string option -> t -> t
              val set_content_encoding : string option -> t -> t
              val set_vtag : string option -> t -> t
              val set_links : Link.t list -> t -> t
              val set_last_mod : Int32.t option -> t -> t
              val set_last_mod_usec : Int32.t option -> t -> t
              val set_usermeta : Usermeta.t list -> t -> t
              val set_indices : Index.t list -> t -> t
            end
          type 'a t =
            'a
            Cache.Make_with_usermeta_index(Events)(Data)(Cache.Default_usermeta)(Cache.Default_index).Robj.t = {
            contents : Content.t list;
            vclock : string option;
            unchanged : bool;
          }
          val create : Content.t -> 'a t
          val of_value : Value.t -> 'a t
          val create_siblings : Content.t list -> 'a t
          val contents : 'a t -> Content.t list
          val content : 'a t -> Content.t
          val vclock : 'a t -> string option
          val unchanged : 'a t -> bool
          val set_contents : Content.t list -> 'a t -> 'b t
          val set_content : Content.t -> 'a t -> 'b t
          val set_vclock : string option -> 'a t -> 'b t
          val to_unsafe : 'a t -> [ `No_siblings ] Unsafe_Robj.t
          val from_unsafe : 'Unsafe_Robj.t -> 'b t
        end
      val create : conn:conn -> bucket:string -> t
      val list_keys_stream :
        t ->
        (Key.t list -> unit Cache.Deferred.t) ->
        (unit,
         [> `Bad_conn
          | `Bad_payload
          | `Incomplete_payload
          | `Overflow
          | `Protobuf_encoder_error
          | `Unknown_type
          | `Wrong_type ])
        Cache.Deferred.Result.t
      val with_cache :
        host:string ->
        port:int ->
        bucket:string ->
        (t -> ('a, [> Conn.error ] as 'e) Cache.Deferred.Result.t) ->
        ('a, 'e) Cache.Deferred.Result.t
      val list_keys :
        t ->
        (Key.t list,
         [> `Bad_conn
          | `Bad_payload
          | `Incomplete_payload
          | `Overflow
          | `Protobuf_encoder_error
          | `Unknown_type
          | `Wrong_type ])
        Cache.Result.t Async_kernel.Deferred.t
      val get :
        t ->
        ?opts:Opts.Get.t list ->
        Key.t ->
        ('Robj.t, [> Opts.Get.error ]) Cache.Result.t Cache.Deferred.t
      val put :
        t ->
        ?opts:Opts.Put.t list ->
        ?k:Key.t ->
        'Robj.t ->
        ('Robj.t * Key.t Cache.Option.t, [> Opts.Put.error ])
        Cache.Result.t Cache.Deferred.t
      val delete :
        t ->
        ?opts:Opts.Delete.t list ->
        Key.t ->
        (unit, [> Opts.Delete.error ]) Cache.Result.t Cache.Deferred.t
      val index_search :
        t ->
        ?opts:Opts.Index_search.t list ->
        index:Index_value.t ->
        Opts.Index_search.Query.t ->
        (Response.Index_search.t, [> Opts.Index_search.error ])
        Cache.Result.t Cache.Deferred.t
      val bucket_props :
        t ->
        (Response.Props.t,
         [> `Bad_conn
          | `Bad_payload
          | `Incomplete_payload
          | `Overflow
          | `Protobuf_encoder_error
          | `Unknown_type
          | `Wrong_type ])
        Cache.Deferred.Result.t
    end
  type update_rule = Prob_cache_common.Update_rules.Update_fn.t
  type prior_count = Events.t -> int
  type prior_exp = Events.t -> float
  type t
  val count :
    Events.t ->
    Model_intf.S.t -> (int, [> Opts.Get.error ]) Async.Std.Deferred.Result.t
  val observe :
    ?cnt:int ->
    ?exp:float ->
    Events.t ->
    Model_intf.S.t ->
    (Model_intf.S.t,
     [> `Bad_conn
      | `Bad_payload
      | `Incomplete_payload
      | `Notfound
      | `Overflow
      | `Protobuf_encoder_error
      | `Unknown_type
      | `Wrong_type ])
    Async.Std.Deferred.Result.t
  val prob :
    ?cond:Events.t ->
    Events.t ->
    Model_intf.S.t ->
    (float, [> Opts.Get.error ]) Async.Std.Deferred.Result.t
  val exp :
    ?cond:Events.t ->
    Events.t ->
    Model_intf.S.t ->
    (float, [> Opts.Get.error ]) Async.Std.Deferred.Result.t
  val name : Model_intf.S.t -> string
  val with_model :
    ?update_rule:Model_intf.S.update_rule ->
    ?prior_count:Model_intf.S.prior_count ->
    ?prior_exp:Model_intf.S.prior_exp ->
    host:string ->
    port:int ->
    name:string ->
    (Model_intf.S.t ->
     ('a, [> Conn.error ] as 'e) Async.Std.Deferred.Result.t) ->
    ('a, 'e) Async.Std.Deferred.Result.t
end