github.com/viant/toolbox@v0.34.5/data/collection.go (about) 1 package data 2 3 import ( 4 "github.com/viant/toolbox" 5 "strings" 6 ) 7 8 //Collection represents a slice of interface{} (generic type) 9 type Collection []interface{} 10 11 //Push appends provided value to the slice 12 func (s *Collection) Push(value interface{}) { 13 (*s) = append(*s, value) 14 } 15 16 //PadWithMap creates missing elements with a map 17 func (s *Collection) PadWithMap(size int) { 18 for i := len(*s); i < size; i++ { 19 s.Push(NewMap()) 20 } 21 } 22 23 //Range iterates over every item in this collection as long as handler returns true. Handler takes an index and index of the slice element. 24 func (s *Collection) Range(handler func(item interface{}, index int) (bool, error)) error { 25 for i, elem := range *s { 26 next, err := handler(elem, i) 27 if err != nil { 28 return err 29 } 30 if !next { 31 break 32 } 33 34 } 35 return nil 36 } 37 38 //RangeMap iterates every map item in this collection as long as handler returns true. Handler takes an index and index of the slice element 39 func (s *Collection) RangeMap(handler func(item Map, index int) (bool, error)) error { 40 var next bool 41 var err error 42 for i, elem := range *s { 43 var aMap, ok = elem.(Map) 44 if !ok { 45 next, err = handler(nil, i) 46 } else { 47 next, err = handler(aMap, i) 48 } 49 if err != nil { 50 return err 51 } 52 if !next { 53 break 54 } 55 56 } 57 return nil 58 } 59 60 //RangeMap iterates every string item in this collection as long as handler returns true. Handler takes an index and index of the slice element 61 func (s *Collection) RangeString(handler func(item interface{}, index int) (bool, error)) error { 62 for i, elem := range *s { 63 next, err := handler(toolbox.AsString(elem), i) 64 if err != nil { 65 return err 66 } 67 if !next { 68 break 69 } 70 71 } 72 return nil 73 74 } 75 76 //RangeMap iterates every int item in this collection as long as handler returns true. Handler takes an index and index of the slice element 77 func (s *Collection) RangeInt(handler func(item interface{}, index int) (bool, error)) error { 78 for i, elem := range *s { 79 next, err := handler(toolbox.AsInt(elem), i) 80 if err != nil { 81 return err 82 } 83 if !next { 84 break 85 } 86 87 } 88 return nil 89 } 90 91 //String returns a string representation of this collection 92 func (s *Collection) String() string { 93 var items = make([]string, 0) 94 for _, item := range *s { 95 items = append(items, toolbox.AsString(item)) 96 } 97 return "[" + strings.Join(items, ",") + "]" 98 } 99 100 //NewCollection creates a new collection and returns a pointer 101 func NewCollection() *Collection { 102 var result Collection = make([]interface{}, 0) 103 return &result 104 }