package mutexes

import (
	"sync"
)

// Cond is similar to a sync.Cond{}, but
// it encompasses the Mutex{} within itself.
type Cond struct {
	c sync.Cond
	sync.Mutex
}

// See: sync.Cond{}.Wait().
func (c *Cond) Wait() {
	if c.c.L == nil {
		c.c.L = &c.Mutex
	}
	c.c.Wait()
}

// See: sync.Cond{}.Signal().
func (c *Cond) Signal() {
	if c.c.L == nil {
		c.c.L = &c.Mutex
	}
	c.c.Signal()
}

// See: sync.Cond{}.Broadcast().
func (c *Cond) Broadcast() {
	if c.c.L == nil {
		c.c.L = &c.Mutex
	}
	c.c.Broadcast()
}

// RWCond is similar to a sync.Cond{}, but
// it encompasses the RWMutex{} within itself.
type RWCond struct {
	c sync.Cond
	sync.RWMutex
}

// See: sync.Cond{}.Wait().
func (c *RWCond) Wait() {
	if c.c.L == nil {
		c.c.L = &c.RWMutex
	}
	c.c.Wait()
}

// See: sync.Cond{}.Signal().
func (c *RWCond) Signal() {
	if c.c.L == nil {
		c.c.L = &c.RWMutex
	}
	c.c.Signal()
}

// See: sync.Cond{}.Broadcast().
func (c *RWCond) Broadcast() {
	if c.c.L == nil {
		c.c.L = &c.RWMutex
	}
	c.c.Broadcast()
}