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  }