sig
  module type S =
    sig
      type identity
      type key
      type server_notif
      type client_notif
      val init : unit -> unit Lwt.t
      val deinit : unit -> unit
      val listen : Eliom_notif.S.key -> unit
      val unlisten : Eliom_notif.S.key -> unit
      module Ext :
        sig
          val unlisten :
            ?sitedata:Eliom_common.sitedata ->
            ([< `Client_process ], [< `Data ]) Eliom_state.Ext.state ->
            Eliom_notif.S.key -> unit
        end
      val notify :
        ?notfor:[ `Id of Eliom_notif.S.identity | `Me ] ->
        Eliom_notif.S.key -> Eliom_notif.S.server_notif -> unit
      val client_ev :
        unit ->
        (Eliom_notif.S.key * Eliom_notif.S.client_notif) Eliom_react.Down.t
      val clean : unit -> unit
    end
  module type ARG =
    sig
      type identity
      type key
      type server_notif
      type client_notif
      val prepare :
        Eliom_notif.ARG.identity ->
        Eliom_notif.ARG.server_notif ->
        Eliom_notif.ARG.client_notif option Lwt.t
      val equal_key : Eliom_notif.ARG.key -> Eliom_notif.ARG.key -> bool
      val equal_identity :
        Eliom_notif.ARG.identity -> Eliom_notif.ARG.identity -> bool
      val get_identity : unit -> Eliom_notif.ARG.identity Lwt.t
      val max_resource : int
      val max_identity_per_resource : int
    end
  module Make :
    functor (A : ARG->
      sig
        type identity = A.identity
        type key = A.key
        type server_notif = A.server_notif
        type client_notif = A.client_notif
        val init : unit -> unit Lwt.t
        val deinit : unit -> unit
        val listen : key -> unit
        val unlisten : key -> unit
        module Ext :
          sig
            val unlisten :
              ?sitedata:Eliom_common.sitedata ->
              ([< `Client_process ], [< `Data ]) Eliom_state.Ext.state ->
              key -> unit
          end
        val notify :
          ?notfor:[ `Id of identity | `Me ] -> key -> server_notif -> unit
        val client_ev : unit -> (key * client_notif) Eliom_react.Down.t
        val clean : unit -> unit
      end
  module type ARG_SIMPLE =
    sig
      type identity
      type key
      type notification
      val get_identity : unit -> Eliom_notif.ARG_SIMPLE.identity Lwt.t
    end
  module Make_Simple :
    functor (A : ARG_SIMPLE->
      sig
        type identity
        type key = A.key
        type server_notif = A.notification
        type client_notif = A.notification
        val init : unit -> unit Lwt.t
        val deinit : unit -> unit
        val listen : key -> unit
        val unlisten : key -> unit
        module Ext :
          sig
            val unlisten :
              ?sitedata:Eliom_common.sitedata ->
              ([< `Client_process ], [< `Data ]) Eliom_state.Ext.state ->
              key -> unit
          end
        val notify :
          ?notfor:[ `Id of identity | `Me ] -> key -> server_notif -> unit
        val client_ev : unit -> (key * client_notif) Eliom_react.Down.t
        val clean : unit -> unit
      end
end