namespace Invercargill.Modifiers { public class Concat : Enumerable { private Enumerable e1; private Enumerable e2; public Concat(Enumerable first, Enumerable second) { e1 = first; e2 = second; } public override int? 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, Convert.ate(new Enumerable[] {e1, e2})); } public override Tracker get_tracker() { var tracker1 = e1.get_tracker(); var tracker2 = e2.get_tracker(); return new LambdaTracker( () => tracker1.has_next() || tracker2.has_next(), () => { if(tracker1.has_next()) { return tracker1.get_next(); } return tracker2.get_next(); }); } } }