add more features

This commit is contained in:
2023-07-17 20:52:42 +01:00
parent 425b73b681
commit aa21a53791
4 changed files with 338 additions and 3 deletions

View File

@@ -1,6 +1,7 @@
package main
import (
"bytes"
"fmt"
)
@@ -150,6 +151,150 @@ func ArBuffer(buf []byte) ArObject {
return obj, ArErr{}
},
}
obj.obj["splitN"] = builtinFunc{
"splitN",
func(a ...any) (any, ArErr) {
if len(a) != 2 {
return nil, ArErr{
TYPE: "TypeError",
message: "expected 1 argument, got " + fmt.Sprint(len(a)),
EXISTS: true,
}
}
splitVal := ArValidToAny(a[0])
if typeof(splitVal) != "buffer" {
return nil, ArErr{
TYPE: "TypeError",
message: "expected buffer, got " + typeof(splitVal),
EXISTS: true,
}
}
var separator = splitVal.([]byte)
nVal := ArValidToAny(a[1])
if typeof(nVal) != "number" {
return nil, ArErr{
TYPE: "TypeError",
message: "expected number, got " + typeof(nVal),
EXISTS: true,
}
}
nNum := nVal.(number)
if nNum.Denom().Cmp(one.Denom()) != 0 {
return nil, ArErr{
TYPE: "TypeError",
message: "expected integer, got " + fmt.Sprint(nNum),
EXISTS: true,
}
}
n := nNum.Num().Int64()
var result [][]byte
start := 0
var i int64
for i = 0; i < n; i++ {
index := bytes.Index(buf[start:], separator)
if index == -1 {
result = append(result, buf[start:])
break
}
end := start + index
result = append(result, buf[start:end])
start = end + len(separator)
}
if int64(len(result)) != n {
result = append(result, buf[start:])
}
var bufoutput = []any{}
for _, v := range result {
bufoutput = append(bufoutput, ArBuffer(v))
}
return ArArray(bufoutput), ArErr{}
},
}
obj.obj["split"] = builtinFunc{
"split",
func(a ...any) (any, ArErr) {
if len(a) != 1 {
return nil, ArErr{
TYPE: "TypeError",
message: "expected 1 argument, got " + fmt.Sprint(len(a)),
EXISTS: true,
}
}
splitVal := ArValidToAny(a[0])
if typeof(splitVal) != "buffer" {
return nil, ArErr{
TYPE: "TypeError",
message: "expected buffer, got " + typeof(splitVal),
EXISTS: true,
}
}
var separator = splitVal.([]byte)
var result [][]byte
start := 0
for {
index := bytes.Index(buf[start:], separator)
if index == -1 {
result = append(result, buf[start:])
break
}
end := start + index
result = append(result, buf[start:end])
start = end + len(separator)
}
var bufoutput = []any{}
for _, v := range result {
bufoutput = append(bufoutput, ArBuffer(v))
}
return ArArray(bufoutput), ArErr{}
},
}
obj.obj["slice"] = builtinFunc{
"slice",
func(a ...any) (any, ArErr) {
if len(a) != 2 {
return nil, ArErr{
TYPE: "TypeError",
message: "expected 2 arguments, got " + fmt.Sprint(len(a)),
EXISTS: true,
}
}
startVal := ArValidToAny(a[0])
if typeof(startVal) != "number" {
return nil, ArErr{
TYPE: "TypeError",
message: "expected number, got " + typeof(startVal),
EXISTS: true,
}
}
start := startVal.(number)
if start.Denom().Cmp(one.Denom()) != 0 {
return nil, ArErr{
TYPE: "TypeError",
message: "expected integer, got " + fmt.Sprint(start),
EXISTS: true,
}
}
endVal := ArValidToAny(a[1])
if typeof(endVal) != "number" {
return nil, ArErr{
TYPE: "TypeError",
message: "expected number, got " + typeof(endVal),
EXISTS: true,
}
}
end := endVal.(number)
if end.Denom().Cmp(one.Denom()) != 0 {
return nil, ArErr{
TYPE: "TypeError",
message: "expected integer, got " + fmt.Sprint(end),
EXISTS: true,
}
}
return ArBuffer(buf[floor(start).Num().Int64():floor(end).Num().Int64()]), ArErr{}
},
}
obj.obj["to"] = builtinFunc{
"to",
func(a ...any) (any, ArErr) {