sig
  module Counting :
    sig
      type t
      val make : int -> Semaphore.Counting.t
      val release : Semaphore.Counting.t -> unit
      val acquire : Semaphore.Counting.t -> unit
      val try_acquire : Semaphore.Counting.t -> bool
      val get_value : Semaphore.Counting.t -> int
    end
  module Binary :
    sig
      type t
      val make : bool -> Semaphore.Binary.t
      val release : Semaphore.Binary.t -> unit
      val acquire : Semaphore.Binary.t -> unit
      val try_acquire : Semaphore.Binary.t -> bool
    end
end