123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- package help
- // Skip bypasses a specified number of elements in a collection and then returns
- // the remaining elements.
- func (q Query) Skip(count int) Query {
- return Query{
- Iterate: func() Iterator {
- next := q.Iterate()
- n := count
- return func() (item interface{}, ok bool) {
- for ; n > 0; n-- {
- item, ok = next()
- if !ok {
- return
- }
- }
- return next()
- }
- },
- }
- }
- // SkipWhile bypasses elements in a collection as long as a specified condition
- // is true and then returns the remaining elements.
- //
- // This method tests each element by using predicate and skips the element if
- // the result is true. After the predicate function returns false for an
- // element, that element and the remaining elements in source are returned and
- // there are no more invocations of predicate.
- func (q Query) SkipWhile(predicate func(interface{}) bool) Query {
- return Query{
- Iterate: func() Iterator {
- next := q.Iterate()
- ready := false
- return func() (item interface{}, ok bool) {
- for !ready {
- item, ok = next()
- if !ok {
- return
- }
- ready = !predicate(item)
- if ready {
- return
- }
- }
- return next()
- }
- },
- }
- }
- // SkipWhileT is the typed version of SkipWhile.
- //
- // - predicateFn is of type "func(TSource)bool"
- //
- // NOTE: SkipWhile has better performance than SkipWhileT.
- func (q Query) SkipWhileT(predicateFn interface{}) Query {
- predicateGenericFunc, err := newGenericFunc(
- "SkipWhileT", "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.SkipWhile(predicateFunc)
- }
- // SkipWhileIndexed bypasses elements in a collection as long as a specified
- // condition is true and then returns the remaining elements. The element's
- // index is used in the logic of the predicate function.
- //
- // This method tests each element by using predicate and skips the element if
- // the result is true. After the predicate function returns false for an
- // element, that element and the remaining elements in source are returned and
- // there are no more invocations of predicate.
- func (q Query) SkipWhileIndexed(predicate func(int, interface{}) bool) Query {
- return Query{
- Iterate: func() Iterator {
- next := q.Iterate()
- ready := false
- index := 0
- return func() (item interface{}, ok bool) {
- for !ready {
- item, ok = next()
- if !ok {
- return
- }
- ready = !predicate(index, item)
- if ready {
- return
- }
- index++
- }
- return next()
- }
- },
- }
- }
- // SkipWhileIndexedT is the typed version of SkipWhileIndexed.
- //
- // - predicateFn is of type "func(int,TSource)bool"
- //
- // NOTE: SkipWhileIndexed has better performance than SkipWhileIndexedT.
- func (q Query) SkipWhileIndexedT(predicateFn interface{}) Query {
- predicateGenericFunc, err := newGenericFunc(
- "SkipWhileIndexedT", "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.SkipWhileIndexed(predicateFunc)
- }
|