github.com/nevalang/neva@v0.23.1-0.20240507185603-7696a9bb8dda/internal/runtime/funcs/list_to_stream.go (about) 1 package funcs 2 3 import ( 4 "context" 5 6 "github.com/nevalang/neva/internal/runtime" 7 ) 8 9 type listToStream struct{} 10 11 func (c listToStream) Create( 12 io runtime.FuncIO, 13 _ runtime.Msg, 14 ) (func(ctx context.Context), error) { 15 dataIn, err := io.In.Port("data") 16 if err != nil { 17 return nil, err 18 } 19 20 seqOut, err := io.Out.Port("seq") 21 if err != nil { 22 return nil, err 23 } 24 25 return func(ctx context.Context) { 26 for { 27 var list []runtime.Msg 28 29 select { 30 case <-ctx.Done(): 31 return 32 case dataMsg := <-dataIn: 33 list = dataMsg.List() 34 } 35 36 for idx := 0; idx < len(list); idx++ { 37 item := streamItem( 38 list[idx], 39 int64(idx), 40 idx == len(list)-1, 41 ) 42 43 select { 44 case <-ctx.Done(): 45 return 46 case seqOut <- item: 47 } 48 } 49 } 50 }, nil 51 }