Unique.vala 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. using Invercargill.DataStructures;
  2. namespace Invercargill.Modifiers {
  3. public class Unique<T, TProp> : Enumerable<T> {
  4. private Enumerable<T> input;
  5. private EqualityDelegate<TProp> comparison;
  6. private TransformDelegate<T, TProp> selector;
  7. public Unique(Enumerable<T> input, owned TransformDelegate<T, TProp> selector, owned EqualityDelegate<TProp> compare) {
  8. this.input = input;
  9. comparison = (owned)compare;
  10. this.selector = (owned)selector;
  11. }
  12. public override Tracker<T> get_tracker() {
  13. var tracker = input.get_tracker();
  14. var previous = new Vector<T>();
  15. return new AdvanceTracker<T>((out item) => {
  16. while(true) {
  17. if(!tracker.has_next()) {
  18. item = null;
  19. return false;
  20. }
  21. var next = tracker.get_next();
  22. if(previous.any(p => comparison(selector(p), selector(next)))) {
  23. continue;
  24. }
  25. previous.add(next);
  26. item = next;
  27. return true;
  28. }
  29. });
  30. }
  31. }
  32. }