star/bed/history/history.go
2025-04-26 19:33:14 +08:00

57 lines
1.2 KiB
Go

package history
import "b612.me/apps/b612/bed/buffer"
// History manages the buffer history.
type History struct {
entries []*historyEntry
index int
}
type historyEntry struct {
buffer *buffer.Buffer
offset int64
cursor int64
tick uint64
}
// NewHistory creates a new history manager.
func NewHistory() *History {
return &History{index: -1}
}
// Push a new buffer to the history.
func (h *History) Push(buffer *buffer.Buffer, offset, cursor int64, tick uint64) {
newEntry := &historyEntry{buffer.Clone(), offset, cursor, tick}
if len(h.entries)-1 > h.index {
h.index++
h.entries[h.index] = newEntry
h.entries = h.entries[:h.index+1]
} else {
h.entries = append(h.entries, newEntry)
h.index++
}
}
// Undo the history.
func (h *History) Undo() (*buffer.Buffer, int, int64, int64, uint64) {
if h.index < 0 {
return nil, h.index, 0, 0, 0
}
if h.index > 0 {
h.index--
}
e := h.entries[h.index]
return e.buffer.Clone(), h.index, e.offset, e.cursor, e.tick
}
// Redo the history.
func (h *History) Redo() (*buffer.Buffer, int64, int64, uint64) {
if h.index == len(h.entries)-1 || h.index < 0 {
return nil, 0, 0, 0
}
h.index++
e := h.entries[h.index]
return e.buffer.Clone(), e.offset, e.cursor, e.tick
}