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

     1  package funcs
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/nevalang/neva/internal/runtime"
     7  )
     8  
     9  type intAdd struct{}
    10  
    11  func (intAdd) Create(
    12  	io runtime.FuncIO,
    13  	_ runtime.Msg,
    14  ) (func(ctx context.Context), error) {
    15  	seqIn, err := io.In.Port("seq")
    16  	if err != nil {
    17  		return nil, err
    18  	}
    19  
    20  	resOut, err := io.Out.Port("res")
    21  	if err != nil {
    22  		return nil, err
    23  	}
    24  
    25  	return func(ctx context.Context) {
    26  		var acc int64 = 0
    27  
    28  		for {
    29  			var item map[string]runtime.Msg
    30  			select {
    31  			case <-ctx.Done():
    32  				return
    33  			case msg := <-seqIn:
    34  				item = msg.Map()
    35  			}
    36  
    37  			acc += item["data"].Int()
    38  
    39  			if item["last"].Bool() {
    40  				select {
    41  				case <-ctx.Done():
    42  					return
    43  				case resOut <- runtime.NewIntMsg(acc):
    44  					acc = 0 // reset
    45  					continue
    46  				}
    47  			}
    48  		}
    49  	}, nil
    50  }