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 }