Skip.vala 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. namespace Invercargill {
  2. private class SkipQuery<T> : BaseQuery<T, T> {
  3. private int n_items {get; set;}
  4. public SkipQuery(Enumerable<T> input, int skip) {
  5. this.input = input;
  6. n_items = skip;
  7. }
  8. public override bool iterate_if (Invercargill.PredicateDelegate<T> handler) {
  9. var c = 0;
  10. return input.iterate_if(i => {
  11. if(c >= n_items) {
  12. c++;
  13. return handler(i);
  14. }
  15. c++;
  16. return true;
  17. });
  18. }
  19. public override Tracker<T> get_tracker() {
  20. var tracker = input.get_tracker();
  21. var c = 0;
  22. return new AdvanceTracker<T>((out obj) => {
  23. obj = null;
  24. while(c < n_items) {
  25. if(!tracker.has_next()) {
  26. return false;
  27. }
  28. tracker.get_next ();
  29. c++;
  30. }
  31. if(tracker.has_next()) {
  32. obj = tracker.get_next();
  33. return true;
  34. }
  35. return false;
  36. });
  37. }
  38. }
  39. }