48 lines
869 B
Go
48 lines
869 B
Go
package main
|
|
|
|
import (
|
|
"render231011/internal/thestore"
|
|
"slices"
|
|
"time"
|
|
)
|
|
|
|
type Oplog struct {
|
|
events []timestampedEvent
|
|
}
|
|
|
|
type timestampedEvent struct {
|
|
t time.Time
|
|
e thestore.Event
|
|
}
|
|
|
|
// gotcha duration? bigger N? whatever
|
|
func NewOplog() Oplog {
|
|
return Oplog{
|
|
events: make([]timestampedEvent, 0, 1024),
|
|
}
|
|
}
|
|
|
|
// todo circular queue if we got time
|
|
func (oplog *Oplog) Push(event thestore.Event) {
|
|
oplog.push(time.Now(), event)
|
|
}
|
|
|
|
func (oplog *Oplog) push(t time.Time, event thestore.Event) {
|
|
oplog.events = append(oplog.events, timestampedEvent{
|
|
t: t,
|
|
e: event,
|
|
})
|
|
}
|
|
|
|
func (oplog *Oplog) Since(t time.Time) []thestore.Event {
|
|
result := make([]thestore.Event, 0, 5)
|
|
for i := len(oplog.events) - 1; i >= 0; i-- {
|
|
if !oplog.events[i].t.After(t) {
|
|
break
|
|
}
|
|
result = append(result, oplog.events[i].e)
|
|
}
|
|
slices.Reverse(result)
|
|
return result
|
|
}
|