mirror of
https://github.com/hanzozt/foundation.git
synced 2026-10-30 14:42:04 +00:00
74 lines
1.3 KiB
Go
74 lines
1.3 KiB
Go
package sequencer
|
|
|
|
import (
|
|
"sync/atomic"
|
|
"time"
|
|
)
|
|
|
|
func NewNoopSequencer(channelDepth int) Sequencer {
|
|
return &noopSeq{
|
|
ch: make(chan interface{}, channelDepth),
|
|
closeNotify: make(chan struct{}),
|
|
}
|
|
}
|
|
|
|
type noopSeq struct {
|
|
ch chan interface{}
|
|
closeNotify chan struct{}
|
|
closed atomic.Bool
|
|
}
|
|
|
|
func (seq *noopSeq) PutSequenced(_ uint32, event interface{}) error {
|
|
select {
|
|
case seq.ch <- event:
|
|
return nil
|
|
case <-seq.closeNotify:
|
|
return ErrClosed
|
|
}
|
|
}
|
|
|
|
func (seq *noopSeq) GetNext() interface{} {
|
|
select {
|
|
case val := <-seq.ch:
|
|
return val
|
|
case <-seq.closeNotify:
|
|
// If we're closed, return any buffered values, otherwise return nil
|
|
select {
|
|
case val := <-seq.ch:
|
|
return val
|
|
default:
|
|
return nil
|
|
}
|
|
}
|
|
}
|
|
|
|
func (seq *noopSeq) GetNextWithDeadline(t time.Time) (interface{}, error) {
|
|
if t.IsZero() {
|
|
result := seq.GetNext()
|
|
if result == nil {
|
|
return nil, ErrClosed
|
|
}
|
|
return result, nil
|
|
}
|
|
|
|
select {
|
|
case v := <-seq.ch:
|
|
return v, nil
|
|
case <-seq.closeNotify:
|
|
select {
|
|
case val := <-seq.ch:
|
|
return val, nil
|
|
default:
|
|
return nil, ErrClosed
|
|
}
|
|
case <-time.After(time.Until(t)):
|
|
return nil, ErrTimedOut
|
|
}
|
|
}
|
|
|
|
func (seq *noopSeq) Close() {
|
|
if seq.closed.CompareAndSwap(false, true) {
|
|
close(seq.closeNotify)
|
|
}
|
|
}
|