github.com/nevalang/neva@v0.23.1-0.20240507185603-7696a9bb8dda/internal/runtime/funcs/range.go (about) 1 package funcs 2 3 import ( 4 "context" 5 6 "github.com/nevalang/neva/internal/runtime" 7 ) 8 9 type streamIntRange struct{} 10 11 func (streamIntRange) Create( 12 io runtime.FuncIO, 13 _ runtime.Msg, 14 ) (func(ctx context.Context), error) { 15 fromIn, err := io.In.Port("from") 16 if err != nil { 17 return nil, err 18 } 19 20 toIn, err := io.In.Port("to") 21 if err != nil { 22 return nil, err 23 } 24 25 dataOut, err := io.Out.Port("data") 26 if err != nil { 27 return nil, err 28 } 29 30 return func(ctx context.Context) { 31 var fromMsg, toMsg runtime.Msg 32 33 for { 34 select { 35 case <-ctx.Done(): 36 return 37 case fromMsg = <-fromIn: 38 } 39 40 select { 41 case <-ctx.Done(): 42 return 43 case toMsg = <-toIn: 44 } 45 46 var ( 47 idx int64 = 0 48 last bool = false 49 data int64 = fromMsg.Int() 50 ) 51 52 for !last { 53 if data == toMsg.Int()-1 { 54 last = true 55 } 56 57 item := streamItem( 58 runtime.NewIntMsg(data), 59 idx, 60 last, 61 ) 62 63 select { 64 case <-ctx.Done(): 65 return 66 case dataOut <- item: 67 } 68 69 idx++ 70 data++ 71 } 72 } 73 }, nil 74 }