sig
  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
    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
    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
    end
end