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

     1  package funcs
     2  
     3  import (
     4  	"context"
     5  	"strings"
     6  
     7  	"github.com/nevalang/neva/internal/runtime"
     8  )
     9  
    10  type stringSplit struct{}
    11  
    12  func (p stringSplit) 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  
    18  	delimIn, err := io.In.Port("delim")
    19  	if err != nil {
    20  		return nil, err
    21  	}
    22  
    23  	resOut, err := io.Out.Port("res")
    24  	if err != nil {
    25  		return nil, err
    26  	}
    27  
    28  	return func(ctx context.Context) {
    29  		var (
    30  			data  runtime.Msg
    31  			delim runtime.Msg
    32  		)
    33  
    34  		for {
    35  			select {
    36  			case <-ctx.Done():
    37  				return
    38  			case data = <-dataIn:
    39  			}
    40  
    41  			select {
    42  			case <-ctx.Done():
    43  				return
    44  			case delim = <-delimIn:
    45  			}
    46  
    47  			splitted := strings.Split(data.Str(), delim.Str())
    48  			res := make([]runtime.Msg, len(splitted))
    49  			for i, s := range splitted {
    50  				res[i] = runtime.NewStrMsg(s)
    51  			}
    52  
    53  			select {
    54  			case <-ctx.Done():
    55  				return
    56  			case resOut <- runtime.NewListMsg(res...):
    57  			}
    58  		}
    59  	}, nil
    60  }