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  }