12345678910111213141516171819202122232425262728293031323334353637 |
- using Invercargill.DataStructures;
- namespace Invercargill.Modifiers {
- public class Unique<T, TProp> : Enumerable<T> {
- private Enumerable<T> input;
- private EqualityDelegate<TProp> comparison;
- private TransformDelegate<T, TProp> selector;
- public Unique(Enumerable<T> input, owned TransformDelegate<T, TProp> selector, owned EqualityDelegate<TProp> compare) {
- this.input = input;
- comparison = (owned)compare;
- this.selector = (owned)selector;
- }
- public override Tracker<T> get_tracker() {
- var tracker = input.get_tracker();
- var previous = new Vector<T>();
- return new AdvanceTracker<T>((out item) => {
- while(true) {
- if(!tracker.has_next()) {
- item = null;
- return false;
- }
- var next = tracker.get_next();
- if(previous.any(p => comparison(selector(p), selector(next)))) {
- continue;
- }
- previous.add(next);
- item = next;
- return true;
- }
- });
- }
- }
- }
|