github.com/nevalang/neva@v0.23.1-0.20240507185603-7696a9bb8dda/internal/runtime/funcs/list_push.go (about) 1 package funcs 2 3 import ( 4 "context" 5 "slices" 6 7 "github.com/nevalang/neva/internal/runtime" 8 ) 9 10 type listPush struct{} 11 12 func (p listPush) Create(io runtime.FuncIO, _ runtime.Msg) (func(ctx context.Context), error) { 13 dataIn, err := io.In.Port("data") 14 if err != nil { 15 return nil, err 16 } 17 lstIn, err := io.In.Port("lst") 18 if err != nil { 19 return nil, err 20 } 21 22 resOut, err := io.Out.Port("res") 23 if err != nil { 24 return nil, err 25 } 26 27 return func(ctx context.Context) { 28 var ( 29 data runtime.Msg 30 lst runtime.Msg 31 ) 32 33 for { 34 select { 35 case <-ctx.Done(): 36 return 37 case data = <-dataIn: 38 } 39 40 select { 41 case <-ctx.Done(): 42 return 43 case lst = <-lstIn: 44 } 45 46 lstCopy := slices.Clone(lst.List()) 47 lstCopy = append(lstCopy, data) 48 49 select { 50 case <-ctx.Done(): 51 return 52 case resOut <- runtime.NewListMsg(lstCopy...): 53 } 54 } 55 }, nil 56 }