github.com/nevalang/neva@v0.23.1-0.20240507185603-7696a9bb8dda/internal/runtime/funcs/int_sub.go (about) 1 package funcs 2 3 import ( 4 "context" 5 6 "github.com/nevalang/neva/internal/runtime" 7 ) 8 9 type intSub struct{} 10 11 func (intSub) Create(io runtime.FuncIO, _ runtime.Msg) (func(ctx context.Context), error) { 12 seqIn, err := io.In.Port("seq") 13 if err != nil { 14 return nil, err 15 } 16 17 resOut, err := io.Out.Port("res") 18 if err != nil { 19 return nil, err 20 } 21 22 return func(ctx context.Context) { 23 var ( 24 acc int64 = 0 25 started bool = false 26 ) 27 28 for { 29 var item map[string]runtime.Msg 30 select { 31 case <-ctx.Done(): 32 return 33 case msg := <-seqIn: 34 item = msg.Map() 35 } 36 37 if !started { 38 acc = item["data"].Int() 39 started = true 40 } else { 41 acc -= item["data"].Int() 42 } 43 44 if item["last"].Bool() { 45 select { 46 case <-ctx.Done(): 47 return 48 case resOut <- runtime.NewIntMsg(acc): 49 acc = 0 50 started = false 51 continue 52 } 53 } 54 } 55 }, nil 56 }