github.com/nevalang/neva@v0.23.1-0.20240507185603-7696a9bb8dda/internal/runtime/funcs/port_streamer.go (about) 1 package funcs 2 3 import ( 4 "context" 5 "errors" 6 7 "github.com/nevalang/neva/internal/runtime" 8 ) 9 10 type arrayPortToStream struct{} 11 12 func (arrayPortToStream) Create( 13 io runtime.FuncIO, 14 _ runtime.Msg, 15 ) (func(context.Context), error) { 16 portIn, ok := io.In["port"] 17 if !ok { 18 return nil, errors.New("missing array inport 'port'") 19 } 20 21 streamOut, err := io.Out.Port("seq") 22 if err != nil { 23 return nil, err 24 } 25 26 return func(ctx context.Context) { 27 for { 28 l := len(portIn) 29 30 for i, slot := range portIn { 31 var msg runtime.Msg 32 select { 33 case <-ctx.Done(): 34 return 35 case msg = <-slot: 36 } 37 38 item := streamItem( 39 msg, 40 int64(i), 41 i == l-1, 42 ) 43 44 select { 45 case <-ctx.Done(): 46 return 47 case streamOut <- item: 48 } 49 } 50 } 51 }, nil 52 }