123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- package help
- // Where filters a collection of values based on a predicate.
- func (q Query) Where(predicate func(interface{}) bool) Query {
- return Query{
- Iterate: func() Iterator {
- next := q.Iterate()
- return func() (item interface{}, ok bool) {
- for item, ok = next(); ok; item, ok = next() {
- if predicate(item) {
- return
- }
- }
- return
- }
- },
- }
- }
- // WhereT is the typed version of Where.
- //
- // - predicateFn is of type "func(TSource)bool"
- //
- // NOTE: Where has better performance than WhereT.
- func (q Query) WhereT(predicateFn interface{}) Query {
- predicateGenericFunc, err := newGenericFunc(
- "WhereT", "predicateFn", predicateFn,
- simpleParamValidator(newElemTypeSlice(new(genericType)), newElemTypeSlice(new(bool))),
- )
- if err != nil {
- panic(err)
- }
- predicateFunc := func(item interface{}) bool {
- return predicateGenericFunc.Call(item).(bool)
- }
- return q.Where(predicateFunc)
- }
- // WhereIndexed filters a collection of values based on a predicate. Each
- // element's index is used in the logic of the predicate function.
- //
- // The first argument represents the zero-based index of the element within
- // collection. The second argument of predicate represents the element to test.
- func (q Query) WhereIndexed(predicate func(int, interface{}) bool) Query {
- return Query{
- Iterate: func() Iterator {
- next := q.Iterate()
- index := 0
- return func() (item interface{}, ok bool) {
- for item, ok = next(); ok; item, ok = next() {
- if predicate(index, item) {
- index++
- return
- }
- index++
- }
- return
- }
- },
- }
- }
- // WhereIndexedT is the typed version of WhereIndexed.
- //
- // - predicateFn is of type "func(int,TSource)bool"
- //
- // NOTE: WhereIndexed has better performance than WhereIndexedT.
- func (q Query) WhereIndexedT(predicateFn interface{}) Query {
- predicateGenericFunc, err := newGenericFunc(
- "WhereIndexedT", "predicateFn", predicateFn,
- simpleParamValidator(newElemTypeSlice(new(int), new(genericType)), newElemTypeSlice(new(bool))),
- )
- if err != nil {
- panic(err)
- }
- predicateFunc := func(index int, item interface{}) bool {
- return predicateGenericFunc.Call(index, item).(bool)
- }
- return q.WhereIndexed(predicateFunc)
- }
|