sig
  module type DATA =
    sig
      type t = { cnt : int; exp : float; }
      val pp : Format.formatter -> Data.DATA.t -> unit
      val show : Data.DATA.t -> string
    end
  module type S =
    sig
      module T : DATA
      type t = T.t
      val create : cnt:int -> exp:float -> Data.S.t
      val count : Data.S.t -> int
      val expect : Data.S.t -> float
      val update :
        cnt:int ->
        exp:float ->
        update_rule:Update_rules.Update_fn.t ->
        prior_count:('-> int) ->
        prior_exp:('-> float) -> '-> Data.S.t option -> Data.S.t
    end
  module Make :
    functor (Data : DATA->
      sig
        module T :
          sig
            type t = Data.t = { cnt : int; exp : float; }
            val pp : Format.formatter -> t -> unit
            val show : t -> string
          end
        type t = T.t
        val create : cnt:int -> exp:float -> t
        val count : t -> int
        val expect : t -> float
        val update :
          cnt:int ->
          exp:float ->
          update_rule:Update_rules.Update_fn.t ->
          prior_count:('-> int) ->
          prior_exp:('-> float) -> '-> t option -> t
      end
end