in lib/collections.go [1172:1200]
func mapKeys(val ref.Val) ref.Val {
mapK, ok := val.(traits.Mapper)
if !ok {
return types.ValOrErr(mapK, "no such overload")
}
n, ok := mapK.Size().(types.Int)
if !ok {
return types.NewErr("unable to get size of map")
}
keys := make([]ref.Val, 0, n)
if mapK.Size() != types.IntZero {
canSort := true
it := mapK.Iterator()
for it.HasNext() == types.True {
k := it.Next()
keys = append(keys, k)
_, ok := k.(traits.Comparer)
if !ok {
canSort = false
}
}
if canSort {
sort.Slice(keys, func(i, j int) bool {
return keys[i].(traits.Comparer).Compare(keys[j]) == types.Int(-1)
})
}
}
return types.NewRefValList(types.DefaultTypeAdapter, keys)
}