github.com/elves/elvish@v0.15.0/pkg/edit/hist_store.go (about)

     1  package edit
     2  
     3  import (
     4  	"sync"
     5  
     6  	"github.com/elves/elvish/pkg/cli/histutil"
     7  	"github.com/elves/elvish/pkg/store"
     8  )
     9  
    10  // A wrapper of histutil.Store that is concurrency-safe and supports an
    11  // additional FastForward method.
    12  type histStore struct {
    13  	m  sync.Mutex
    14  	db store.Store
    15  	hs histutil.Store
    16  }
    17  
    18  func newHistStore(db store.Store) (*histStore, error) {
    19  	hs, err := histutil.NewHybridStore(db)
    20  	return &histStore{db: db, hs: hs}, err
    21  }
    22  
    23  func (s *histStore) AddCmd(cmd store.Cmd) (int, error) {
    24  	s.m.Lock()
    25  	defer s.m.Unlock()
    26  	return s.hs.AddCmd(cmd)
    27  }
    28  
    29  func (s *histStore) AllCmds() ([]store.Cmd, error) {
    30  	s.m.Lock()
    31  	defer s.m.Unlock()
    32  	return s.hs.AllCmds()
    33  }
    34  
    35  func (s *histStore) Cursor(prefix string) histutil.Cursor {
    36  	s.m.Lock()
    37  	defer s.m.Unlock()
    38  	return cursor{&s.m, histutil.NewDedupCursor(s.hs.Cursor(prefix))}
    39  }
    40  
    41  func (s *histStore) FastForward() error {
    42  	s.m.Lock()
    43  	defer s.m.Unlock()
    44  	hs, err := histutil.NewHybridStore(s.db)
    45  	s.hs = hs
    46  	return err
    47  }
    48  
    49  type cursor struct {
    50  	m *sync.Mutex
    51  	c histutil.Cursor
    52  }
    53  
    54  func (c cursor) Prev() {
    55  	c.m.Lock()
    56  	defer c.m.Unlock()
    57  	c.c.Prev()
    58  }
    59  
    60  func (c cursor) Next() {
    61  	c.m.Lock()
    62  	defer c.m.Unlock()
    63  	c.c.Next()
    64  }
    65  
    66  func (c cursor) Get() (store.Cmd, error) {
    67  	c.m.Lock()
    68  	defer c.m.Unlock()
    69  	return c.c.Get()
    70  }