interview/render-2023-10-11/cmd/cache-service/oplog.go

54 lines
1015 B
Go

package main
import (
"render231011/internal/thestore"
"slices"
"time"
)
type Oplog struct {
events []timestampedEvent
idx int // todo
lastTruncated time.Time
}
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, bool) {
if !t.After(oplog.lastTruncated) {
return nil, false
}
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, len(result) > 0
}