github.com/jmigpin/editor@v1.6.0/util/iout/iorw/rwevents.go (about)

     1  package iorw
     2  
     3  import (
     4  	"github.com/jmigpin/editor/util/evreg"
     5  )
     6  
     7  // Runs callbacks on operations.
     8  type RWEvents struct {
     9  	ReadWriterAt
    10  	EvReg evreg.Register
    11  }
    12  
    13  func NewRWEvents(rw ReadWriterAt) *RWEvents {
    14  	return &RWEvents{ReadWriterAt: rw}
    15  }
    16  
    17  func (rw *RWEvents) OverwriteAt(i, n int, p []byte) error {
    18  	// pre write event
    19  	ev := &RWEvPreWrite{i, n, p, nil}
    20  	rw.EvReg.RunCallbacks(RWEvIdPreWrite, ev)
    21  	if ev.ReplyErr != nil {
    22  		return ev.ReplyErr
    23  	}
    24  
    25  	// write event 2 data (contains content changed flag)
    26  	changed := true
    27  	if rw.EvReg.NCallbacks(RWEvIdWrite2) > 0 {
    28  		if eq, err := REqual(rw, i, n, p); err == nil && eq {
    29  			changed = false
    30  		}
    31  	}
    32  
    33  	if err := rw.ReadWriterAt.OverwriteAt(i, n, p); err != nil {
    34  		return err
    35  	}
    36  
    37  	// write event
    38  	u := &RWEvWrite{i, n, len(p)}
    39  	rw.EvReg.RunCallbacks(RWEvIdWrite, u)
    40  
    41  	// write event 2 (contains content changed flag)
    42  	w := &RWEvWrite2{*u, changed}
    43  	rw.EvReg.RunCallbacks(RWEvIdWrite2, w)
    44  
    45  	return nil
    46  }
    47  
    48  //----------
    49  
    50  const (
    51  	RWEvIdWrite    = iota // ev=RWEvWrite
    52  	RWEvIdWrite2          // ev=RWEvWrite2
    53  	RWEvIdPreWrite        // ev=RWEvPreWrite
    54  )
    55  
    56  //----------
    57  
    58  type RWEvWrite struct {
    59  	Index int
    60  	Dn    int // n deleted bytes
    61  	In    int // n inserted bytes
    62  }
    63  
    64  type RWEvWrite2 struct {
    65  	RWEvWrite
    66  	Changed bool
    67  }
    68  
    69  type RWEvPreWrite struct {
    70  	Index    int
    71  	N        int
    72  	P        []byte
    73  	ReplyErr error // can be set by any caller to cancel the write
    74  }