MCPcopy
hub / github.com/flosch/pongo2 / IterateOrder

Method IterateOrder

value.go:390–474  ·  view source on GitHub ↗

IterateOrder behaves like Value.Iterate, but can iterate through an array/slice/string in reverse. Does not affect the iteration through a map because maps don't have any particular order. However, you can force an order using the `sorted` keyword (and even use `reversed sorted`).

(fn func(idx, count int, key, value *Value) bool, empty func(), reverse bool, sorted bool)

Source from the content-addressed store, hash-verified

388// not affect the iteration through a map because maps don't have any particular order.
389// However, you can force an order using the `sorted` keyword (and even use `reversed sorted`).
390func (v *Value) IterateOrder(fn func(idx, count int, key, value *Value) bool, empty func(), reverse bool, sorted bool) {
391 switch v.getResolvedValue().Kind() {
392 case reflect.Map:
393 keys := sortedKeys(v.getResolvedValue().MapKeys())
394 if sorted {
395 if reverse {
396 sort.Sort(sort.Reverse(keys))
397 } else {
398 sort.Sort(keys)
399 }
400 }
401 keyLen := len(keys)
402 for idx, key := range keys {
403 value := v.getResolvedValue().MapIndex(key)
404 if !fn(idx, keyLen, &Value{val: key}, &Value{val: value}) {
405 return
406 }
407 }
408 if keyLen == 0 {
409 empty()
410 }
411 return // done
412 case reflect.Array, reflect.Slice:
413 var items valuesList
414
415 itemCount := v.getResolvedValue().Len()
416 for i := 0; i < itemCount; i++ {
417 items = append(items, &Value{val: v.getResolvedValue().Index(i)})
418 }
419
420 if sorted {
421 if reverse {
422 sort.Sort(sort.Reverse(items))
423 } else {
424 sort.Sort(items)
425 }
426 } else {
427 if reverse {
428 for i := 0; i < itemCount/2; i++ {
429 items[i], items[itemCount-1-i] = items[itemCount-1-i], items[i]
430 }
431 }
432 }
433
434 if len(items) > 0 {
435 for idx, item := range items {
436 if !fn(idx, itemCount, item, nil) {
437 return
438 }
439 }
440 } else {
441 empty()
442 }
443 return // done
444 case reflect.String:
445 if sorted {
446 // TODO(flosch): Handle sorted
447 panic("TODO: handle sort for type string")

Callers 2

IterateMethod · 0.95
ExecuteMethod · 0.80

Calls 7

getResolvedValueMethod · 0.95
sortedKeysTypeAlias · 0.85
logfFunction · 0.85
IndexMethod · 0.80
SliceMethod · 0.80
LenMethod · 0.45
StringMethod · 0.45

Tested by

no test coverage detected