diff options
Diffstat (limited to 'commands')
-rw-r--r-- | commands/history.go | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/commands/history.go b/commands/history.go new file mode 100644 index 0000000..77bb155 --- /dev/null +++ b/commands/history.go @@ -0,0 +1,62 @@ +package commands + +type cmdHistory struct { + // rolling buffer of prior commands + // + // most recent command is at the end of the list, + // least recent is index 0 + cmdList []string + + // current placement in list + current int +} + +// number of commands to keep in history +const cmdLimit = 1000 + +// CmdHistory is the history of executed commands +var CmdHistory = cmdHistory{} + +func (h *cmdHistory) Add(cmd string) { + // if we're at cap, cut off the first element + if len(h.cmdList) >= cmdLimit { + h.cmdList = h.cmdList[1:] + } + + h.cmdList = append(h.cmdList, cmd) + + // whenever we add a new command, reset the current + // pointer to the "beginning" of the list + h.Reset() +} + +// Prev returns the previous command in history. +// Since the list is reverse-order, this will return elements +// increasingly towards index 0. +func (h *cmdHistory) Prev() string { + if h.current <= 0 || len(h.cmdList) == 0 { + h.current = -1 + return "(Already at beginning)" + } + h.current-- + + return h.cmdList[h.current] +} + +// Next returns the next command in history. +// Since the list is reverse-order, this will return elements +// increasingly towards index len(cmdList). +func (h *cmdHistory) Next() string { + if h.current >= len(h.cmdList)-1 || len(h.cmdList) == 0 { + h.current = len(h.cmdList) + return "(Already at end)" + } + h.current++ + + return h.cmdList[h.current] +} + +// Reset the current pointer to the beginning of history. +func (h *cmdHistory) Reset() { + h.current = len(h.cmdList) +} |