fix broken sort function

This commit is contained in:
2023-07-28 19:42:31 +02:00
parent ab94c9ff65
commit b2bd683e08
2 changed files with 7 additions and 16 deletions

View File

@@ -452,10 +452,10 @@ func Map(m anymap) ArObject {
mutex.RLock() mutex.RLock()
keys := []any{} keys := []any{}
for k := range m { for k := range m {
keys = append(keys, k) keys = append(keys, AnyToArValid(k))
} }
mutex.RUnlock() mutex.RUnlock()
return keys, ArErr{} return ArArray(keys), ArErr{}
}, },
} }
obj.obj["__Boolean__"] = builtinFunc{ obj.obj["__Boolean__"] = builtinFunc{

View File

@@ -4,8 +4,6 @@ import (
"fmt" "fmt"
) )
type keyCache map[any]any
func quickSort(list []any, getKey func(any) (any, ArErr)) ([]any, ArErr) { func quickSort(list []any, getKey func(any) (any, ArErr)) ([]any, ArErr) {
if len(list) <= 1 { if len(list) <= 1 {
return list, ArErr{} return list, ArErr{}
@@ -15,21 +13,19 @@ func quickSort(list []any, getKey func(any) (any, ArErr)) ([]any, ArErr) {
var left []any var left []any
var right []any var right []any
var cache = make(keyCache)
for _, v := range list[1:] { for _, v := range list[1:] {
val, err := getkeyCache(getKey, v, cache) val, err := getkeyCache(getKey, v)
if err.EXISTS { if err.EXISTS {
return nil, err return nil, err
} }
pivotval, err := getkeyCache(getKey, pivot, cache) pivotval, err := getkeyCache(getKey, pivot)
if err.EXISTS { if err.EXISTS {
return nil, err return nil, err
} }
comp, comperr := compare(val, pivotval) comp, comperr := compare(val, pivotval)
if comperr != nil { if comperr != nil {
return nil, ArErr{ return nil, ArErr{
TYPE: "TypeError", TYPE: "Runtime Error",
message: comperr.Error(), message: comperr.Error(),
EXISTS: true, EXISTS: true,
} }
@@ -53,16 +49,11 @@ func quickSort(list []any, getKey func(any) (any, ArErr)) ([]any, ArErr) {
return append(append(left, pivot), right...), ArErr{} return append(append(left, pivot), right...), ArErr{}
} }
func getkeyCache(getKey func(any) (any, ArErr), index any, cache keyCache) (any, ArErr) { func getkeyCache(getKey func(any) (any, ArErr), key any) (any, ArErr) {
key := ArValidToAny(index) val, err := getKey(key)
if cacheval, ok := cache[key]; ok {
return cacheval, ArErr{}
}
val, err := getKey(index)
if err.EXISTS { if err.EXISTS {
return nil, err return nil, err
} }
cache[key] = val
return val, ArErr{} return val, ArErr{}
} }