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  }