package histutil

import 

// NewDBStore returns a Store backed by a database with the view of all
// commands frozen at creation.
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 {
		// Don't change c.cmd
		.err = 
	}
}

func ( *dbStoreCursor) () (store.Cmd, error) {
	return .cmd, .err
}