func mapValues()

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)
}