github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/core/ranges/buffer.go (about)

     1  package ranges
     2  
     3  import (
     4  	"github.com/lmorg/murex/builtins/pipes/streams"
     5  	"github.com/lmorg/murex/lang"
     6  	"github.com/lmorg/murex/lang/stdio"
     7  )
     8  
     9  func buffer(p *lang.Process, dt string) (stdio.Io, int, error) {
    10  	stdin := streams.NewStdinWithContext(p.Context, p.Done)
    11  	stdin.SetDataType(dt)
    12  
    13  	array, err := stdin.WriteArray(dt)
    14  	if err != nil {
    15  		return nil, 0, err
    16  	}
    17  
    18  	var (
    19  		nestedErr error
    20  		length    int
    21  	)
    22  
    23  	err = p.Stdin.ReadArray(p.Context, func(b []byte) {
    24  		nestedErr = array.Write(b)
    25  		if nestedErr != nil {
    26  			p.Done()
    27  			return
    28  		}
    29  		length++
    30  	})
    31  
    32  	if nestedErr != nil {
    33  		return nil, 0, nestedErr
    34  	}
    35  
    36  	if err != nil {
    37  		return nil, 0, err
    38  	}
    39  
    40  	return stdin, length, array.Close()
    41  }