sig
  module type THREAD_LOCAL_STATE =
    sig
      type 'a t
      type 'a key
      val new_key : unit -> 'Sqlexpr_concurrency.THREAD_LOCAL_STATE.key
      val get : 'Sqlexpr_concurrency.THREAD_LOCAL_STATE.key -> 'a option
      val with_value :
        'Sqlexpr_concurrency.THREAD_LOCAL_STATE.key ->
        'a option ->
        (unit -> 'Sqlexpr_concurrency.THREAD_LOCAL_STATE.t) ->
        'Sqlexpr_concurrency.THREAD_LOCAL_STATE.t
    end
  module type THREAD =
    sig
      type 'a t
      val return : '-> 'Sqlexpr_concurrency.THREAD.t
      val bind :
        'Sqlexpr_concurrency.THREAD.t ->
        ('-> 'Sqlexpr_concurrency.THREAD.t) ->
        'Sqlexpr_concurrency.THREAD.t
      val fail : exn -> 'Sqlexpr_concurrency.THREAD.t
      val catch :
        (unit -> 'Sqlexpr_concurrency.THREAD.t) ->
        (exn -> 'Sqlexpr_concurrency.THREAD.t) ->
        'Sqlexpr_concurrency.THREAD.t
      val finalize :
        (unit -> 'Sqlexpr_concurrency.THREAD.t) ->
        (unit -> unit Sqlexpr_concurrency.THREAD.t) ->
        'Sqlexpr_concurrency.THREAD.t
      val sleep : float -> unit Sqlexpr_concurrency.THREAD.t
      val auto_yield : float -> unit -> unit Sqlexpr_concurrency.THREAD.t
      type mutex
      val create_recursive_mutex : unit -> Sqlexpr_concurrency.THREAD.mutex
      val with_lock :
        Sqlexpr_concurrency.THREAD.mutex ->
        (unit -> 'Sqlexpr_concurrency.THREAD.t) ->
        'Sqlexpr_concurrency.THREAD.t
      val register_finaliser :
        ('-> unit Sqlexpr_concurrency.THREAD.t) -> '-> unit
      type 'a key
      val new_key : unit -> 'a key
      val get : 'a key -> 'a option
      val with_value : 'a key -> 'a option -> (unit -> 'b t) -> 'b t
    end
  module Id :
    sig
      type 'a t = 'a
      val return : '-> 'a t
      val bind : 'a t -> ('-> 'b t) -> 'b t
      val fail : exn -> 'a t
      val catch : (unit -> 'a t) -> (exn -> 'a t) -> 'a t
      val finalize : (unit -> 'a t) -> (unit -> unit t) -> 'a t
      val sleep : float -> unit t
      val auto_yield : float -> unit -> unit t
      type mutex
      val create_recursive_mutex : unit -> mutex
      val with_lock : mutex -> (unit -> 'a t) -> 'a t
      val register_finaliser : ('-> unit t) -> '-> unit
      type 'a key = 'Lwt.key
      val new_key : unit -> 'a key
      val get : 'a key -> 'a option
      val with_value : 'a key -> 'a option -> (unit -> 'b t) -> 'b t
    end
  module Lwt :
    sig
      type 'a t = 'Lwt.t
      val return : '-> 'a t
      val bind : 'a t -> ('-> 'b t) -> 'b t
      val fail : exn -> 'a t
      val catch : (unit -> 'a t) -> (exn -> 'a t) -> 'a t
      val finalize : (unit -> 'a t) -> (unit -> unit t) -> 'a t
      val sleep : float -> unit t
      val auto_yield : float -> unit -> unit t
      type mutex
      val create_recursive_mutex : unit -> mutex
      val with_lock : mutex -> (unit -> 'a t) -> 'a t
      val register_finaliser : ('-> unit t) -> '-> unit
      type 'a key = 'Lwt.key
      val new_key : unit -> 'a key
      val get : 'a key -> 'a option
      val with_value : 'a key -> 'a option -> (unit -> 'b t) -> 'b t
    end
end