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 }