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 }