Bladeren bron

Add fork and zip (untested)

Billy Barrow 3 jaren geleden
bovenliggende
commit
fc353cad22
5 gewijzigde bestanden met toevoegingen van 49 en 4 verwijderingen
  1. 1 1
      src/lib/Concrete/PairEnumerable.vala
  2. 25 0
      src/lib/Concrete/ZipperEnumerable.vala
  3. 14 1
      src/lib/Enumerable.vala
  4. 6 1
      src/lib/Pair.vala
  5. 3 1
      src/lib/meson.build

+ 1 - 1
src/lib/Concrete/PairEnumerable.vala

@@ -14,7 +14,7 @@ namespace Invercargill {
             var current1 = s1.root;
             var current2 = s2.root;
             while(current1 != null || current2 != null) {
-                if(!handler(new Pair<T1, T2>(current1?.value, current2?.value))) {
+                if(!handler(new Pair<T1, T2>(current1?.value, current1 != null, current2?.value, current2 != null))) {
                     return false;
                 }
                 current1 = current1?.next;

+ 25 - 0
src/lib/Concrete/ZipperEnumerable.vala

@@ -0,0 +1,25 @@
+namespace Invercargill {
+
+    public class ZipperEnumerable<T> : Enumerable<T> {
+
+        private Enumerable<Pair<T, T>> inputs;
+
+        public ZipperEnumerable(Enumerable<T> seq1, Enumerable<T> seq2) {
+            inputs = seq1.pair<T>(seq2);
+        }
+
+        public override bool iterate_if (PredicateDelegate<T> handler) {
+            return inputs.iterate_if (i => {
+                if(i.value1_is_set) {
+                    if(!handler(i.value1)) { return false; }
+                }
+                if(i.value2_is_set) {
+                    if(!handler(i.value2)) { return false; }
+                }
+                return true;
+            });
+        }
+
+    }
+
+}

+ 14 - 1
src/lib/Enumerable.vala

@@ -66,7 +66,7 @@ namespace Invercargill {
         }
 
         public virtual Enumerable<Tout> select_many<Tout>(TransformDelegate<T, Enumerable<Tout>> transform) {
-            return new MergeQuery<Tout>(new TransformQuery<T, Enumerable<Tout>>(this, transform));
+            return new MergeQuery<Tout>(select(transform));
         }
 
         public virtual Enumerable<T> sort(CompareDelegate<T> compare) {
@@ -101,6 +101,19 @@ namespace Invercargill {
             return to_sequence().pair(other);
         }
 
+        public virtual Enumerable<T> zip(Enumerable<T> other) {
+            return new ZipperEnumerable<T>(this, other);
+        }
+
+        public virtual Enumerable<Tout> fork<Tout>(TransformDelegate<T, Tout> fork1, TransformDelegate<T, Tout> fork2) {
+            var seq = to_sequence();
+            return seq.select<Tout>(fork1).zip(seq.select<Tout>(fork2));
+        }
+
+        public virtual Enumerable<Tout> fork_many<Tout>(TransformDelegate<T, Enumerable<Tout>> fork1, TransformDelegate<T, Enumerable<Tout>> fork2) {
+            return new MergeQuery<Tout>(fork(fork1, fork2));
+        }
+
         public virtual bool matches(Enumerable<T> other, EqualityDelegate<T> equals) {
             return pair(other).all(p => equals(p.value1, p.value2));
         }

+ 6 - 1
src/lib/Pair.vala

@@ -6,9 +6,14 @@ namespace Invercargill {
         public T1 value1 {get; set;}
         public T2 value2 {get; set;}
 
-        public Pair(T1 v1, T2 v2) {
+        public bool value1_is_set {get; set;}
+        public bool value2_is_set {get; set;}
+
+        public Pair(T1 v1, bool v1set, T2 v2, bool v2set) {
             value1 = v1;
+            value1_is_set = v1set;
             value2 = v2;
+            value2_is_set = v2set;
         }
     }
 

+ 3 - 1
src/lib/meson.build

@@ -26,6 +26,7 @@ sources += files('Concrete/RangeEnumerable.vala')
 sources += files('Concrete/ConcatEnumerable.vala')
 sources += files('Concrete/PairEnumerable.vala')
 sources += files('Concrete/DirEnumerable.vala')
+sources += files('Concrete/ZipperEnumerable.vala')
 sources += files('Concrete/Sequence.vala')
 
 invercargill = shared_library('invercargill', sources,
@@ -46,4 +47,5 @@ custom_target('invercargill typelib', command: [g_ir_compiler, '--shared-library
               output: 'invercargill-1.0.typelib',
               depends: invercargill,
               install: true,
-              install_dir: get_option('libdir') / 'girepository-1.0')
+              install_dir: get_option('libdir') / 'girepository-1.0')
+