feat: added extended enum (enumx) module.
This commit is contained in:
parent
c8df427cca
commit
15a6039b46
5 changed files with 114 additions and 7 deletions
22
tests/array.tengo
Normal file
22
tests/array.tengo
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
enum := import("enumx")
|
||||||
|
fmt := import("log")
|
||||||
|
|
||||||
|
object := {
|
||||||
|
key1: "cock",
|
||||||
|
key2: "dick",
|
||||||
|
key3: "check",
|
||||||
|
key4: "die",
|
||||||
|
key5: "wasd"
|
||||||
|
}
|
||||||
|
keys := enum.keys(object)
|
||||||
|
values := enum.values(object)
|
||||||
|
|
||||||
|
sorted_values := enum.sort(values, func(a, b){
|
||||||
|
return b < a
|
||||||
|
})
|
||||||
|
|
||||||
|
ia := [5, 100, 531, 7537, 1, 2, -100, 1.535]
|
||||||
|
fmt.println(enum.sort(ia))
|
||||||
|
fmt.println(sorted_values)
|
||||||
|
|
||||||
|
|
69
xmodules/enumx/main.go
Normal file
69
xmodules/enumx/main.go
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
package enumx
|
||||||
|
|
||||||
|
import "github.com/d5/tengo/v2"
|
||||||
|
|
||||||
|
const src = `
|
||||||
|
|
||||||
|
_swap := func(arr, left, right) {
|
||||||
|
if arr == undefined || len(arr) <= 1 || left < 0 || left >= len(arr) || right < 0 || right >= len(arr) || left >= right {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
temp := arr[right]
|
||||||
|
arr[right] = arr[left]
|
||||||
|
arr[left] = temp
|
||||||
|
}
|
||||||
|
|
||||||
|
_sort := func(arr, left, right, less) {
|
||||||
|
if arr == undefined || len(arr) <= 1 || left < 0 || left >= len(arr) || right < 0 || right >= len(arr) || left >= right {
|
||||||
|
return arr
|
||||||
|
}
|
||||||
|
idx := left
|
||||||
|
for i := left; i < right; i++ {
|
||||||
|
if less(arr[i], arr[right]) {
|
||||||
|
_swap(arr, idx, i)
|
||||||
|
idx++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_swap(arr, idx, right)
|
||||||
|
_sort(arr, left, idx-1, less)
|
||||||
|
_sort(arr, idx+1, right, less)
|
||||||
|
return arr
|
||||||
|
}
|
||||||
|
|
||||||
|
export {
|
||||||
|
keys: func(x){
|
||||||
|
ret := []
|
||||||
|
for k, _ in x {
|
||||||
|
ret += [k]
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
},
|
||||||
|
values: func(x){
|
||||||
|
ret := []
|
||||||
|
for _, v in x {
|
||||||
|
ret += [v]
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
},
|
||||||
|
sort: func(arr, ...less) {
|
||||||
|
if !less {
|
||||||
|
less = func(a, b){
|
||||||
|
return a < b
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
less = less[0]
|
||||||
|
}
|
||||||
|
if arr == undefined || len(arr) <= 1 {
|
||||||
|
return arr
|
||||||
|
}
|
||||||
|
return _sort(arr, 0, len(arr)-1, less)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
`
|
||||||
|
|
||||||
|
func GetModule() tengo.Importable {
|
||||||
|
return &tengo.SourceModule{
|
||||||
|
Src: []byte(src),
|
||||||
|
}
|
||||||
|
}
|
|
@ -25,12 +25,16 @@ var Module = map[string]tengo.Object{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
v := make([]any, len(args[1:]))
|
/*v := make([]any, len(args[1:]))
|
||||||
for i, o := range args[1:] {
|
for i, o := range args[1:] {
|
||||||
v[i] = tengo.ToInterface(o)
|
v[i] = tengo.ToInterface(o)
|
||||||
}
|
}*/
|
||||||
|
|
||||||
log.Printf(format, v...)
|
str, err := tengo.Format(format, args...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
log.Print(str)
|
||||||
|
|
||||||
return nil, nil
|
return nil, nil
|
||||||
},
|
},
|
||||||
|
@ -42,7 +46,11 @@ var Module = map[string]tengo.Object{
|
||||||
) (tengo.Object, error){
|
) (tengo.Object, error){
|
||||||
v := make([]any, len(args))
|
v := make([]any, len(args))
|
||||||
for i, o := range args {
|
for i, o := range args {
|
||||||
v[i] = tengo.ToInterface(o)
|
var ok bool
|
||||||
|
v[i], ok = tengo.ToString(o)
|
||||||
|
if !ok {
|
||||||
|
v[i] = tengo.Undefined{}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
log.Print(v...)
|
log.Print(v...)
|
||||||
return nil, nil
|
return nil, nil
|
||||||
|
@ -55,7 +63,11 @@ var Module = map[string]tengo.Object{
|
||||||
) (tengo.Object, error){
|
) (tengo.Object, error){
|
||||||
v := make([]any, len(args))
|
v := make([]any, len(args))
|
||||||
for i, o := range args {
|
for i, o := range args {
|
||||||
v[i] = tengo.ToInterface(o)
|
var ok bool
|
||||||
|
v[i], ok = tengo.ToString(o)
|
||||||
|
if !ok {
|
||||||
|
v[i] = tengo.Undefined{}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
log.Println(v...)
|
log.Println(v...)
|
||||||
return nil, nil
|
return nil, nil
|
||||||
|
|
|
@ -7,6 +7,7 @@ import "surdeus.su/core/xgo/xmodules/paths"
|
||||||
import "surdeus.su/core/xgo/xmodules/httpx"
|
import "surdeus.su/core/xgo/xmodules/httpx"
|
||||||
import "surdeus.su/core/xgo/xmodules/htmlx"
|
import "surdeus.su/core/xgo/xmodules/htmlx"
|
||||||
import "surdeus.su/core/xgo/xmodules/objects"
|
import "surdeus.su/core/xgo/xmodules/objects"
|
||||||
|
import "surdeus.su/core/xgo/xmodules/enumx"
|
||||||
import "github.com/d5/tengo/v2"
|
import "github.com/d5/tengo/v2"
|
||||||
|
|
||||||
// The main map to import all the implemented modules.
|
// The main map to import all the implemented modules.
|
||||||
|
@ -18,5 +19,6 @@ func GetModules() *tengo.ModuleMap {
|
||||||
ret.AddBuiltinModule("http", httpx.Module)
|
ret.AddBuiltinModule("http", httpx.Module)
|
||||||
ret.AddBuiltinModule("html", htmlx.Module)
|
ret.AddBuiltinModule("html", htmlx.Module)
|
||||||
ret.Add("objects", objects.GetModule())
|
ret.Add("objects", objects.GetModule())
|
||||||
|
ret.Add("enumx", enumx.GetModule())
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,7 @@ import "surdeus.su/core/xgo/xmodules"
|
||||||
|
|
||||||
const (
|
const (
|
||||||
sourceFileExt = ".xgo"
|
sourceFileExt = ".xgo"
|
||||||
|
sourceFileExtMain = ".tengo"
|
||||||
replPrompt = ">> "
|
replPrompt = ">> "
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -84,7 +85,8 @@ func Run(flags *mtool.Flags) {
|
||||||
_, _ = fmt.Fprintln(os.Stderr, err.Error())
|
_, _ = fmt.Fprintln(os.Stderr, err.Error())
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
} else if filepath.Ext(inputFile) == sourceFileExt {
|
} else if ext := filepath.Ext(inputFile)
|
||||||
|
ext == sourceFileExt || ext == sourceFileExtMain {
|
||||||
err := CompileAndRun(modules, inputData, inputFile)
|
err := CompileAndRun(modules, inputData, inputFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
_, _ = fmt.Fprintln(os.Stderr, err.Error())
|
_, _ = fmt.Fprintln(os.Stderr, err.Error())
|
||||||
|
@ -218,7 +220,7 @@ func RunREPL(modules *tengo.ModuleMap, in io.Reader, out io.Writer) {
|
||||||
modules,
|
modules,
|
||||||
nil,
|
nil,
|
||||||
)
|
)
|
||||||
c.SetImportFileExt(sourceFileExt)
|
c.SetImportFileExt(sourceFileExt, sourceFileExtMain)
|
||||||
if err := c.Compile(file); err != nil {
|
if err := c.Compile(file); err != nil {
|
||||||
_, _ = fmt.Fprintln(out, err.Error())
|
_, _ = fmt.Fprintln(out, err.Error())
|
||||||
continue
|
continue
|
||||||
|
|
Loading…
Reference in a new issue