package utils import "fmt" type HistoryBuffer[T any] struct { maxSize int items []T } func NewHistoryBuffer[T any](maxSize int) *HistoryBuffer[T] { return &HistoryBuffer[T]{ maxSize: maxSize, items: make([]T, 0, maxSize), } } func (self *HistoryBuffer[T]) Push(item T) { if len(self.items) == self.maxSize { self.items = self.items[:len(self.items)-1] } self.items = append([]T{item}, self.items...) } func (self *HistoryBuffer[T]) PeekAt(index int) (T, error) { var item T if len(self.items) == 0 { return item, fmt.Errorf("Buffer is empty") } if len(self.items) <= index || index < -1 { return item, fmt.Errorf("Index out of range") } if index == -1 { return item, nil } return self.items[index], nil }