|
@@ -0,0 +1,33 @@
|
|
|
+namespace Invercargill {
|
|
|
+
|
|
|
+ private class UniqueQuery<T> : BaseQuery<T, T> {
|
|
|
+ private EqualityDelegate<T> comparison;
|
|
|
+
|
|
|
+ public UniqueQuery(Enumerable<T> input, owned EqualityDelegate<T> compare) {
|
|
|
+ this.input = input;
|
|
|
+ comparison = (owned)compare;
|
|
|
+ }
|
|
|
+
|
|
|
+ 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(p, next))) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ previous.add(next);
|
|
|
+ item = next;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+}
|