in lib/collections.go [1202:1243]
func mapValues(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")
}
values := make([]ref.Val, 0, n)
type valComparer interface {
ref.Val
traits.Comparer
}
type kv struct {
Key valComparer
Value ref.Val
}
if mapK.Size() != types.IntZero {
canSort := true
it := mapK.Iterator()
ss := make([]kv, 0, n)
for it.HasNext() == types.True {
k := it.Next()
v := mapK.Get(k)
ck, ok := k.(valComparer)
if !ok {
canSort = false
}
ss = append(ss, kv{ck, v})
}
if canSort {
sort.Slice(ss, func(i, j int) bool {
return ss[i].Key.Compare(ss[j].Key) == types.Int(-1)
})
}
for _, kv := range ss {
values = append(values, kv.Value)
}
}
return types.NewRefValList(types.DefaultTypeAdapter, values)
}