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