sig   type lock   val create :     enter:(unit -> unit) -> leave:(unit -> unit) -> BatConcurrent.lock   val nolock : BatConcurrent.lock   val synchronize : (unit -> BatConcurrent.lock) -> ('-> 'b) -> '-> 'b   val sync : BatConcurrent.lock -> ('-> 'b) -> '-> 'b   val compose :     BatConcurrent.lock -> BatConcurrent.lock -> BatConcurrent.lock   module type BaseLock =     sig       type t       val create : unit -> BatConcurrent.BaseLock.t       val lock : BatConcurrent.BaseLock.t -> unit       val unlock : BatConcurrent.BaseLock.t -> unit       val try_lock : BatConcurrent.BaseLock.t -> bool     end   module type Lock =     sig       type t       val create : unit -> BatConcurrent.Lock.t       val lock : BatConcurrent.Lock.t -> unit       val unlock : BatConcurrent.Lock.t -> unit       val try_lock : BatConcurrent.Lock.t -> bool       val synchronize : ?lock:BatConcurrent.Lock.t -> ('-> 'b) -> '-> 'b       val make : unit -> BatConcurrent.lock     end   module MakeLock :     functor (M : BaseLock->       sig         type t = M.t         val create : unit -> t         val lock : t -> unit         val unlock : t -> unit         val try_lock : t -> bool         val synchronize : ?lock:t -> ('-> 'b) -> '-> 'b         val make : unit -> lock       end   module NoLock : Lock end