package utils import "sync" // SequenceNumberGenerator can be used to generate increasing numbers. type SequenceNumberGenerator interface { // Next returns the next number Next() uint64 // Revert can be used to decrease the number (e.g. in case of an error) Revert() } // DefaultSequenceNumberGenerator is a mutex protected implementation of SequenceNumberGenerator type DefaultSequenceNumberGenerator struct { sequenceNumber uint64 sequenceNumberLock sync.Mutex } // NewDefaultSequenceNumberGenerator returns an instance of DefaultSequenceNumberGenerator as pointer // of SequenceNumberGenerator. func NewDefaultSequenceNumberGenerator() *SequenceNumberGenerator { var generator SequenceNumberGenerator = &DefaultSequenceNumberGenerator{ sequenceNumber: 0, sequenceNumberLock: sync.Mutex{}, } return &generator } // Next implements SequenceNumberGenerator.Next func (g *DefaultSequenceNumberGenerator) Next() uint64 { g.sequenceNumberLock.Lock() defer g.sequenceNumberLock.Unlock() next := g.sequenceNumber g.sequenceNumber += 1 return next } // Revert implements SequenceNumberGenerator.Revert func (g *DefaultSequenceNumberGenerator) Revert() { g.sequenceNumberLock.Lock() defer g.sequenceNumberLock.Unlock() g.sequenceNumber -= 1 }