package subscription

import (
	"sync"
)

type Subscription struct {
	sync.RWMutex

	err  error
	done chan struct{}
}

func New() *Subscription {
	return &Subscription{
		done: make(chan struct{}),
	}
}

func (s *Subscription) Cancel(err error) {
	s.Lock()
	defer s.Unlock()

	if s.done == nil {
		return
	}

	close(s.done)
	s.done = nil
	s.err = err
}

func (s *Subscription) Unsubscribe() {
	s.Lock()
	defer s.Unlock()

	if s.done == nil {
		return
	}

	close(s.done)
	s.done = nil
}

func (s *Subscription) Err() error {
	s.RLock()
	defer s.RUnlock()
	return s.err
}

func (s *Subscription) Done() <-chan struct{} {
	s.RLock()
	defer s.RUnlock()
	return s.done
}