github.com/andy2046/gopie@v0.7.0/pkg/sequence/memsequence.go (about)

     1  package sequence
     2  
     3  import (
     4  	"errors"
     5  	"sync"
     6  )
     7  
     8  // MemSeq is an implementation of in-memory Sequencer.
     9  type MemSeq struct {
    10  	sync.Mutex
    11  	current uint64
    12  	machine uint64
    13  }
    14  
    15  var (
    16  	errLessThanToo           = errors.New("`n` should not be less than 1")
    17  	_              Sequencer = &MemSeq{}
    18  )
    19  
    20  // NewMemSeq creates a MemSeq.
    21  func NewMemSeq(machineID uint64) *MemSeq {
    22  	return &MemSeq{
    23  		machine: machineID,
    24  	}
    25  }
    26  
    27  // Next ...
    28  func (m *MemSeq) Next() (uint64, error) {
    29  	return m.NextN(1)
    30  }
    31  
    32  // NextN ...
    33  func (m *MemSeq) NextN(n int) (uint64, error) {
    34  	if n < 1 {
    35  		return 0, errLessThanToo
    36  	}
    37  	m.Lock()
    38  	r := m.current
    39  	m.current += uint64(n)
    40  	m.Unlock()
    41  	return r, nil
    42  }
    43  
    44  // MachineID ...
    45  func (m *MemSeq) MachineID() uint64 {
    46  	return m.machine
    47  }