github.com/nevalang/neva@v0.23.1-0.20240507185603-7696a9bb8dda/internal/runtime/funcs/unwrap.go (about)

     1  package funcs
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/nevalang/neva/internal/runtime"
     7  )
     8  
     9  type unwrap struct{}
    10  
    11  func (unwrap) Create(io runtime.FuncIO, _ runtime.Msg) (func(ctx context.Context), error) {
    12  	dataIn, err := io.In.Port("data")
    13  	if err != nil {
    14  		return nil, err
    15  	}
    16  
    17  	someOut, err := io.Out.Port("some")
    18  	if err != nil {
    19  		return nil, err
    20  	}
    21  
    22  	noneOut, err := io.Out.Port("none")
    23  	if err != nil {
    24  		return nil, err
    25  	}
    26  
    27  	return func(ctx context.Context) {
    28  		var dataMsg runtime.Msg
    29  
    30  		for {
    31  			select {
    32  			case <-ctx.Done():
    33  				return
    34  			case dataMsg = <-dataIn:
    35  			}
    36  
    37  			if dataMsg == nil {
    38  				select {
    39  				case <-ctx.Done():
    40  					return
    41  				case noneOut <- runtime.NewMapMsg(nil):
    42  				}
    43  				continue
    44  			}
    45  
    46  			select {
    47  			case <-ctx.Done():
    48  				return
    49  			case someOut <- dataMsg:
    50  			}
    51  		}
    52  	}, nil
    53  }