github.com/nevalang/neva@v0.23.1-0.20240507185603-7696a9bb8dda/internal/runtime/funcs/int_add.go (about) 1 package funcs 2 3 import ( 4 "context" 5 6 "github.com/nevalang/neva/internal/runtime" 7 ) 8 9 type intAdd struct{} 10 11 func (intAdd) Create( 12 io runtime.FuncIO, 13 _ runtime.Msg, 14 ) (func(ctx context.Context), error) { 15 seqIn, err := io.In.Port("seq") 16 if err != nil { 17 return nil, err 18 } 19 20 resOut, err := io.Out.Port("res") 21 if err != nil { 22 return nil, err 23 } 24 25 return func(ctx context.Context) { 26 var acc int64 = 0 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 acc += item["data"].Int() 38 39 if item["last"].Bool() { 40 select { 41 case <-ctx.Done(): 42 return 43 case resOut <- runtime.NewIntMsg(acc): 44 acc = 0 // reset 45 continue 46 } 47 } 48 } 49 }, nil 50 }