Skip.vala 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. namespace Invercargill.Modifiers {
  2. public class Skip<T> : Enumerable<T> {
  3. private Enumerable<T> input;
  4. private int n_items {get; set;}
  5. public Skip(Enumerable<T> input, int skip) {
  6. this.input = input;
  7. n_items = skip;
  8. }
  9. public override int? peek_count() {
  10. var c = input.peek_count();
  11. if(c == null)
  12. return null;
  13. return int.max(0, c - n_items);
  14. }
  15. public override EnumerableInfo get_info() {
  16. return new EnumerableInfo.infer_single(this, EnumerableCategory.COMPUTED, input);
  17. }
  18. public override bool iterate_if (Invercargill.PredicateDelegate<T> handler) {
  19. var c = 0;
  20. return input.iterate_if(i => {
  21. if(c >= n_items) {
  22. c++;
  23. return handler(i);
  24. }
  25. c++;
  26. return true;
  27. });
  28. }
  29. public override Tracker<T> get_tracker() {
  30. var tracker = input.get_tracker();
  31. var c = 0;
  32. return new AdvanceTracker<T>((out obj) => {
  33. obj = null;
  34. while(c < n_items) {
  35. if(!tracker.has_next()) {
  36. return false;
  37. }
  38. tracker.get_next ();
  39. c++;
  40. }
  41. if(tracker.has_next()) {
  42. obj = tracker.get_next();
  43. return true;
  44. }
  45. return false;
  46. });
  47. }
  48. }
  49. }