// package chainlock implements a mutex whose Lock and Unlock
// methods return the lock itself, to enable chaining.
//
// Intended Usage
//
//	  defer s.lock().unlock()
//	  // drop lock while waiting for wait group
//	  func() {
//		     defer a.l.Unlock().Lock()
//		     fssesDone.Wait()
//		 }()
package chainlock

import "sync"

type L struct {
	mtx sync.Mutex
}

func New() *L {
	return &L{}
}

func (l *L) Lock() *L {
	l.mtx.Lock()
	return l
}

func (l *L) Unlock() *L {
	l.mtx.Unlock()
	return l
}

func (l *L) NewCond() *sync.Cond {
	return sync.NewCond(&l.mtx)
}

func (l *L) DropWhile(f func()) {
	defer l.Unlock().Lock()
	f()
}

func (l *L) HoldWhile(f func()) {
	defer l.Lock().Unlock()
	f()
}