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  }