namespace Invercargill.Modifiers { public class Interleave : Enumerable { private Enumerable e1; private Enumerable e2; public Interleave(Enumerable en1, Enumerable 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 get_tracker() { var t1 = e1.get_tracker(); var t2 = e2.get_tracker(); var last = t2; return new LambdaTracker( () => 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(); } }); } } }