| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- namespace Invercargill.Modifiers {
- public class Interleave<T> : Enumerable<T> {
- private Enumerable<T> e1;
- private Enumerable<T> e2;
- public Interleave(Enumerable<T> en1, Enumerable<T> en2) {
- e1 = en1;
- e2 = en2;
- }
- public override uint? peek_count() {
- var c1 = e1.peek_count();
- var c2 = e2.peek_count();
- if(c1 == null || c2 == null)
- return null;
- return c1 + c2;
- }
- public override EnumerableInfo get_info() {
- return new EnumerableInfo.infer(this, EnumerableCategory.COMPUTED, Iterate.these(e1, e2));
- }
- public override Tracker<T> get_tracker() {
- var t1 = e1.get_tracker();
- var t2 = e2.get_tracker();
- var last = t2;
- return new LambdaTracker<T>(
- () => t1.has_next() || t2.has_next(),
- () => {
- if(last == t1 && t2.has_next()) {
- last = t2;
- return t2.get_next();
- }
- else if(last == t2 && t1.has_next()) {
- last = t1;
- return t1.get_next();
- }
- else if(t1.has_next()) {
- last = t1;
- return t1.get_next();
- }
- else {
- last = t2;
- return t2.get_next();
- }
- });
- }
- }
- }
|