Filter.vala 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. namespace Invercargill {
  2. private class FilterQuery<T> : BaseQuery<T, T> {
  3. private PredicateDelegate<T> predicate_func;
  4. public FilterQuery(Enumerable<T> input, owned PredicateDelegate<T> func) {
  5. this.input = input;
  6. predicate_func = (owned)func;
  7. }
  8. // public override bool iterate_if (Invercargill.PredicateDelegate<T> handler) {
  9. // return input.iterate_if(i => {
  10. // if(predicate_func(i)) {
  11. // if(!handler(i)) {
  12. // return false;
  13. // }
  14. // }
  15. // return true;
  16. // });
  17. // }
  18. public override Tracker<T> get_tracker() {
  19. var tracker = input.get_tracker();
  20. return new AdvanceTracker<T>((out obj) => {
  21. while(tracker.has_next()) {
  22. var item = tracker.get_next();
  23. if(predicate_func(item)){
  24. obj = item;
  25. return true;
  26. }
  27. }
  28. obj = null;
  29. return false;
  30. });
  31. }
  32. }
  33. }