package histutil
import
func ( DB) (Store, error) {
, := .NextCmdSeq()
if != nil {
return nil,
}
return dbStore{, }, nil
}
type dbStore struct {
db DB
upper int
}
func ( dbStore) () ([]store.Cmd, error) {
return .db.CmdsWithSeq(0, .upper)
}
func ( dbStore) ( store.Cmd) (int, error) {
return .db.AddCmd(.Text)
}
func ( dbStore) ( string) Cursor {
return &dbStoreCursor{
.db, , .upper, store.Cmd{Seq: .upper}, ErrEndOfHistory}
}
type dbStoreCursor struct {
db DB
prefix string
upper int
cmd store.Cmd
err error
}
func ( *dbStoreCursor) () {
if .cmd.Seq < 0 {
return
}
, := .db.PrevCmd(.cmd.Seq, .prefix)
.set(, , -1)
}
func ( *dbStoreCursor) () {
if .cmd.Seq >= .upper {
return
}
, := .db.NextCmd(.cmd.Seq+1, .prefix)
if .Seq < .upper {
.set(, , .upper)
}
if .Seq >= .upper {
.cmd = store.Cmd{Seq: .upper}
.err = ErrEndOfHistory
}
}
func ( *dbStoreCursor) ( store.Cmd, error, int) {
if == nil {
.cmd =
.err = nil
} else if .Error() == store.ErrNoMatchingCmd.Error() {
.cmd = store.Cmd{Seq: }
.err = ErrEndOfHistory
} else {
.err =
}
}
func ( *dbStoreCursor) () (store.Cmd, error) {
return .cmd, .err
}