package utils

import (
	"sync"
	"sync/atomic"
)

type WaitGroup interface {
	Add(delta int)
	Done()
	Wait()
}

type CountWaitGroup struct {
	wg  sync.WaitGroup
	num atomic.Int64
}

func (c *CountWaitGroup) Add(delta int) {
	c.wg.Add(delta)
	c.num.Add(int64(delta))
}

func (c *CountWaitGroup) Done() {
	c.wg.Done()
	c.num.Add(-1)
}

func (c *CountWaitGroup) Wait() {
	c.wg.Wait()
}

func (c *CountWaitGroup) Count() uint64 {
	return uint64(c.num.Load())
}

func WgWait[T WaitGroup](wg T) <-chan struct{} {
	ch := make(chan struct{})
	go func() {
		wg.Wait()
		ch <- struct{}{}
	}()
	return ch
}
