Jelajahi Sumber

Add Composition

Billy Barrow 2 minggu lalu
induk
melakukan
93fd8c8c52
2 mengubah file dengan 73 tambahan dan 0 penghapusan
  1. 72 0
      src/lib/Composition.vala
  2. 1 0
      src/lib/meson.build

+ 72 - 0
src/lib/Composition.vala

@@ -0,0 +1,72 @@
+
+namespace Invercargill {
+
+    public class Composition<T> : Enumerable<T> {
+
+        private DataStructures.Series<Enumerable<T>> enumerables = new DataStructures.Series<Enumerable<T>>();
+
+        public override Tracker<T> get_tracker () {
+            return enumerables.select_many<T>(i => i).get_tracker();
+        }
+
+        public override int? peek_count () {
+            var count = 0;
+            foreach (var enumerable in enumerables) {
+                var peek = enumerable.peek_count();
+                if(peek == null) {
+                    return null;
+                }
+                count += peek;
+            }
+            return count;
+        }
+
+        public override EnumerableInfo get_info () {
+            return new EnumerableInfo.infer (this, EnumerableCategory.COMPUTED, enumerables);
+        }
+
+        public void prepend(Enumerable<T> items) {
+            enumerables.add_start (items);
+        }
+
+        public void append(Enumerable<T> items) {
+            enumerables.add (items);
+        }
+
+        public void prepend_item(T item) {
+            enumerables.add_start (Iterate.single(item));
+        }
+
+        public void apppend_item(T item) {
+            enumerables.add (Iterate.single(item));
+        }
+
+        public void clear() {
+            enumerables.clear();
+        }
+
+        public void remove_where(owned PredicateDelegate<T> predicate) {
+            var old_enumerables = enumerables;
+            enumerables = new DataStructures.Series<Enumerable<T>>();
+            enumerables.add(old_enumerables.select_many<T>(i => i).where(i => !predicate(i)));
+        }
+
+        public void remove_first_where(owned PredicateDelegate<T> predicate) {
+            var old_enumerables = enumerables;
+            var condition_met = false;
+            enumerables = new DataStructures.Series<Enumerable<T>>();
+            enumerables.add(old_enumerables.select_many<T>(i => i).where(i => {
+                if(condition_met) {
+                    return true;
+                }
+                if(predicate(i)) {
+                    condition_met = true;
+                    return false;
+                }
+                return true;
+            }));
+        }
+
+    }
+
+}

+ 1 - 0
src/lib/meson.build

@@ -31,6 +31,7 @@ sources += files('OrderConfiguration.vala')
 sources += files('Iterate.vala')
 sources += files('Wrap.vala')
 sources += files('Partition.vala')
+sources += files('Composition.vala')
 
 sources += files('Modifiers/Transform.vala')
 sources += files('Modifiers/Filter.vala')