浏览代码

Bugfix for unique

Billy Barrow 1 年之前
父节点
当前提交
e0cd5a43d5
共有 3 个文件被更改,包括 36 次插入3 次删除
  1. 2 3
      src/lib/Enumerable.vala
  2. 33 0
      src/lib/Queries/Unique.vala
  3. 1 0
      src/lib/meson.build

+ 2 - 3
src/lib/Enumerable.vala

@@ -218,9 +218,8 @@ namespace Invercargill {
             });
         }
 
-        public virtual Enumerable<T> unique(EqualityDelegate<T> comparison) {
-            var vec = new Vector<T>();
-            return this.where(i => vec.no(e => comparison(i, e))).act(i => vec.add(i));
+        public virtual Enumerable<T> unique(owned EqualityDelegate<T> comparison) {
+            return new UniqueQuery<T>(this, (owned)comparison);
         }
 
         public virtual Enumerable<T> with(T item) {

+ 33 - 0
src/lib/Queries/Unique.vala

@@ -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;
+                }
+
+            });
+        }
+    }
+
+}

+ 1 - 0
src/lib/meson.build

@@ -25,6 +25,7 @@ sources += files('Queries/Sort.vala')
 sources += files('Queries/Skip.vala')
 sources += files('Queries/Take.vala')
 sources += files('Queries/Parallel.vala')
+sources += files('Queries/Unique.vala')
 
 sources += files('Concrete/ArrayEnumerable.vala')
 sources += files('Concrete/GeeEnumerable.vala')