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  }