github.com/oweisse/u-root@v0.0.0-20181109060735-d005ad25fef1/cmds/elvish/edit/history/fuser.go (about) 1 package history 2 3 import ( 4 "sync" 5 6 "github.com/u-root/u-root/cmds/elvish/store/storedefs" 7 ) 8 9 // Fuser provides a unified view into a shared storage-backed command history 10 // and per-session history. 11 type Fuser struct { 12 store storedefs.Store 13 storeUpper int 14 15 *sync.RWMutex 16 17 // Per-session history. 18 cmds []string 19 seqs []int 20 } 21 22 func NewFuser(store storedefs.Store) (*Fuser, error) { 23 upper, err := store.Next() 24 if err != nil { 25 return nil, err 26 } 27 return &Fuser{ 28 store: store, 29 storeUpper: upper, 30 RWMutex: &sync.RWMutex{}, 31 }, nil 32 } 33 34 func (f *Fuser) FastForward() error { 35 f.Lock() 36 defer f.Unlock() 37 38 upper, err := f.store.Next() 39 if err != nil { 40 return err 41 } 42 f.storeUpper = upper 43 f.cmds = nil 44 f.seqs = nil 45 return nil 46 } 47 48 func (f *Fuser) AddCmd(cmd string) error { 49 f.Lock() 50 defer f.Unlock() 51 seq, err := f.store.Add(cmd) 52 if err != nil { 53 return err 54 } 55 f.cmds = append(f.cmds, cmd) 56 f.seqs = append(f.seqs, seq) 57 return nil 58 } 59 60 func (f *Fuser) AllCmds() ([]string, error) { 61 f.RLock() 62 defer f.RUnlock() 63 cmds, err := f.store.List(0, f.storeUpper) 64 if err != nil { 65 return nil, err 66 } 67 return append(cmds, f.cmds...), nil 68 } 69 70 func (f *Fuser) SessionCmds() []string { 71 return f.cmds 72 } 73 74 func (f *Fuser) Walker(prefix string) *Walker { 75 f.RLock() 76 defer f.RUnlock() 77 return NewWalker(f.store, f.storeUpper, f.cmds, f.seqs, prefix) 78 }