github.com/kolbycrouch/elvish@v0.14.1-0.20210614162631-215b9ac1c423/pkg/edit/hist_store.go (about)

     1  package edit
     2  
     3  import (
     4  	"sync"
     5  
     6  	"src.elv.sh/pkg/cli/histutil"
     7  	"src.elv.sh/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  // AllCmds returns a slice of all interactive commands in oldest to newest order.
    30  func (s *histStore) AllCmds() ([]store.Cmd, error) {
    31  	s.m.Lock()
    32  	defer s.m.Unlock()
    33  	return s.hs.AllCmds()
    34  }
    35  
    36  func (s *histStore) Cursor(prefix string) histutil.Cursor {
    37  	s.m.Lock()
    38  	defer s.m.Unlock()
    39  	return cursor{&s.m, histutil.NewDedupCursor(s.hs.Cursor(prefix))}
    40  }
    41  
    42  func (s *histStore) FastForward() error {
    43  	s.m.Lock()
    44  	defer s.m.Unlock()
    45  	hs, err := histutil.NewHybridStore(s.db)
    46  	s.hs = hs
    47  	return err
    48  }
    49  
    50  type cursor struct {
    51  	m *sync.Mutex
    52  	c histutil.Cursor
    53  }
    54  
    55  func (c cursor) Prev() {
    56  	c.m.Lock()
    57  	defer c.m.Unlock()
    58  	c.c.Prev()
    59  }
    60  
    61  func (c cursor) Next() {
    62  	c.m.Lock()
    63  	defer c.m.Unlock()
    64  	c.c.Next()
    65  }
    66  
    67  func (c cursor) Get() (store.Cmd, error) {
    68  	c.m.Lock()
    69  	defer c.m.Unlock()
    70  	return c.c.Get()
    71  }