github.com/jmigpin/editor@v1.6.0/util/iout/iorw/rwundo/edits.go (about) 1 package rwundo 2 3 import ( 4 "container/list" 5 6 "github.com/jmigpin/editor/util/iout/iorw" 7 "github.com/jmigpin/editor/util/iout/iorw/rwedit" 8 ) 9 10 ////godebug:annotatefile 11 12 type Edits struct { 13 list list.List 14 preCursor rwedit.SimpleCursor 15 postCursor rwedit.SimpleCursor 16 } 17 18 func (edits *Edits) Append(ur *UndoRedo) { 19 // set pre cursor once 20 if edits.list.Len() == 0 { 21 if len(ur.D) > 0 { 22 edits.preCursor.SetSelection(ur.Index, ur.Index+len(ur.D)) 23 } else { 24 edits.preCursor.SetIndex(ur.Index) 25 } 26 } 27 28 edits.list.PushBack(ur) 29 30 // renew post cursor on each append 31 if len(ur.I) > 0 { 32 edits.postCursor.SetSelection(ur.Index, ur.Index+len(ur.I)) 33 } else { 34 edits.postCursor.SetIndexSelectionOff(ur.Index) 35 } 36 } 37 38 //---------- 39 40 func (edits *Edits) MergeEdits(edits2 *Edits) { 41 // append list 42 for e := edits2.list.Front(); e != nil; e = e.Next() { 43 ur := e.Value.(*UndoRedo) 44 edits.Append(ur) 45 } 46 // merge cursor position 47 if edits.list.Len() == 0 { 48 edits.preCursor = edits2.preCursor 49 } 50 edits.postCursor = edits2.postCursor 51 } 52 53 //---------- 54 55 func (edits *Edits) WriteUndoRedo(redo bool, w iorw.WriterAt) (rwedit.SimpleCursor, error) { 56 if redo { 57 for e := edits.list.Front(); e != nil; e = e.Next() { 58 ur := e.Value.(*UndoRedo) 59 if err := ur.Apply(redo, w); err != nil { 60 return rwedit.SimpleCursor{}, err 61 } 62 } 63 return edits.postCursor, nil 64 } else { 65 for e := edits.list.Back(); e != nil; e = e.Prev() { 66 ur := e.Value.(*UndoRedo) 67 if err := ur.Apply(redo, w); err != nil { 68 return rwedit.SimpleCursor{}, err 69 } 70 } 71 return edits.preCursor, nil 72 } 73 } 74 75 //---------- 76 77 func (edits *Edits) Entries() []*UndoRedo { 78 w := make([]*UndoRedo, edits.list.Len()) 79 i := 0 80 for e := edits.list.Front(); e != nil; e = e.Next() { 81 ur := e.Value.(*UndoRedo) 82 w[i] = ur 83 i++ 84 } 85 return w 86 } 87 88 func (edits *Edits) Empty() bool { 89 for e := edits.list.Front(); e != nil; e = e.Next() { 90 ur := e.Value.(*UndoRedo) 91 if len(ur.D) > 0 || len(ur.I) > 0 { 92 return false 93 } 94 } 95 return true 96 }