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 }