github.com/insolar/vanilla@v0.0.0-20201023172447-248fdf805322/iokit/trigger.go (about) 1 // Copyright 2020 Insolar Network Ltd. 2 // All rights reserved. 3 // This material is licensed under the Insolar License version 1.0, 4 // available at https://github.com/insolar/assured-ledger/blob/master/LICENSE.md. 5 6 package iokit 7 8 import "io" 9 10 func LimitReaderWithTrigger(r io.Reader, n int64, triggerFn func(int64)) *LimitedTriggerReader { 11 return &LimitedTriggerReader{LimitedReader{TeeReader{R: r}, n}, triggerFn} 12 } 13 14 var _ io.ReadCloser = &LimitedTriggerReader{} 15 16 type hLimitedReader = LimitedReader 17 type LimitedTriggerReader struct { 18 hLimitedReader 19 t func(int64) 20 } 21 22 func (p *LimitedTriggerReader) Read(b []byte) (int, error) { 23 if p.hLimitedReader.n <= 0 { 24 return 0, io.ErrUnexpectedEOF 25 } 26 n, err := p.hLimitedReader.Read(b) 27 if p.hLimitedReader.n <= 0 { 28 p.trigger() 29 } 30 return n, err 31 } 32 33 func (p *LimitedTriggerReader) trigger() { 34 if p.t == nil { 35 return 36 } 37 //p.hLimitedReader.R.W = nil 38 t := p.t 39 p.t = nil 40 t(p.hLimitedReader.n) 41 } 42 43 func (p *LimitedTriggerReader) Close() error { 44 p.trigger() 45 return nil 46 }