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 }