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 }