github.com/songzhibin97/go-baseutils@v0.0.2-0.20240302024150-487d8ce9c082/structure/lists/singlylinkedlist/enumerable.go (about) 1 package singlylinkedlist 2 3 import "github.com/songzhibin97/go-baseutils/structure/containers" 4 5 // Assert Enumerable implementation 6 var _ containers.EnumerableWithIndex[any] = (*List[any])(nil) 7 8 // Each calls the given function once for each element, passing that element's index and value. 9 func (list *List[E]) Each(f func(index int, value E)) { 10 iterator := list.Iterator() 11 for iterator.Next() { 12 f(iterator.Index(), iterator.Value()) 13 } 14 } 15 16 // Map invokes the given function once for each element and returns a 17 // container containing the values returned by the given function. 18 func (list *List[E]) Map(f func(index int, value E) E) *List[E] { 19 newList := &List[E]{} 20 iterator := list.Iterator() 21 for iterator.Next() { 22 newList.Add(f(iterator.Index(), iterator.Value())) 23 } 24 return newList 25 } 26 27 // Select returns a new container containing all elements for which the given function returns a true value. 28 func (list *List[E]) Select(f func(index int, value E) bool) *List[E] { 29 newList := &List[E]{} 30 iterator := list.Iterator() 31 for iterator.Next() { 32 if f(iterator.Index(), iterator.Value()) { 33 newList.Add(iterator.Value()) 34 } 35 } 36 return newList 37 } 38 39 // Any passes each element of the container to the given function and 40 // returns true if the function ever returns true for any element. 41 func (list *List[E]) Any(f func(index int, value E) bool) bool { 42 iterator := list.Iterator() 43 for iterator.Next() { 44 if f(iterator.Index(), iterator.Value()) { 45 return true 46 } 47 } 48 return false 49 } 50 51 // All passes each element of the container to the given function and 52 // returns true if the function returns true for all elements. 53 func (list *List[E]) All(f func(index int, value E) bool) bool { 54 iterator := list.Iterator() 55 for iterator.Next() { 56 if !f(iterator.Index(), iterator.Value()) { 57 return false 58 } 59 } 60 return true 61 } 62 63 // Find passes each element of the container to the given function and returns 64 // the first (index,value) for which the function is true or -1,nil otherwise 65 // if no element matches the criteria. 66 func (list *List[E]) Find(f func(index int, value E) bool) (index int, value E) { 67 iterator := list.Iterator() 68 for iterator.Next() { 69 if f(iterator.Index(), iterator.Value()) { 70 return iterator.Index(), iterator.Value() 71 } 72 } 73 return -1, list.zero 74 }