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

     1  package lists
     2  
     3  import (
     4  	"github.com/lmorg/murex/lang"
     5  	"github.com/lmorg/murex/lang/types"
     6  )
     7  
     8  func init() {
     9  	lang.DefineMethod("prepend", cmdPrepend, types.ReadArray, types.WriteArray)
    10  	lang.DefineMethod("append", cmdAppend, types.ReadArray, types.WriteArray)
    11  }
    12  
    13  func cmdPrepend(p *lang.Process) error {
    14  	dt := p.Stdin.GetDataType()
    15  	p.Stdout.SetDataType(dt)
    16  
    17  	if err := p.ErrIfNotAMethod(); err != nil {
    18  		return err
    19  	}
    20  
    21  	var (
    22  		array    []interface{}
    23  		cachedDt string
    24  	)
    25  
    26  	err := p.Stdin.ReadArrayWithType(p.Context, func(v interface{}, dt string) {
    27  		array = append(array, v)
    28  		cachedDt = dt
    29  	})
    30  
    31  	if err != nil {
    32  		return err
    33  	}
    34  
    35  	var new []interface{}
    36  	params := p.Parameters.StringArray()
    37  	for i := range params {
    38  		v, err := types.ConvertGoType(params[i], cachedDt)
    39  		if err != nil {
    40  			return err
    41  		}
    42  		new = append(new, v)
    43  	}
    44  	array = append(new, array...)
    45  
    46  	b, err := lang.MarshalData(p, dt, array)
    47  	if err != nil {
    48  		return err
    49  	}
    50  
    51  	_, err = p.Stdout.Write(b)
    52  	return err
    53  }
    54  
    55  func cmdAppend(p *lang.Process) error {
    56  	dt := p.Stdin.GetDataType()
    57  	p.Stdout.SetDataType(dt)
    58  
    59  	if err := p.ErrIfNotAMethod(); err != nil {
    60  		return err
    61  	}
    62  
    63  	var (
    64  		array    []interface{}
    65  		cachedDt string
    66  	)
    67  
    68  	err := p.Stdin.ReadArrayWithType(p.Context, func(v interface{}, dt string) {
    69  		array = append(array, v)
    70  		cachedDt = dt
    71  	})
    72  
    73  	if err != nil {
    74  		return err
    75  	}
    76  
    77  	params := p.Parameters.StringArray()
    78  	for i := range params {
    79  		v, err := types.ConvertGoType(params[i], cachedDt)
    80  		if err != nil {
    81  			return err
    82  		}
    83  		array = append(array, v)
    84  	}
    85  
    86  	b, err := lang.MarshalData(p, dt, array)
    87  	if err != nil {
    88  		return err
    89  	}
    90  
    91  	_, err = p.Stdout.Write(b)
    92  	return err
    93  }