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 }