namespace Invercargill.Modifiers { public class From : Enumerable { private Enumerable input; private PredicateDelegate predicate_func; public From(Enumerable input, owned PredicateDelegate func) { this.input = input; predicate_func = (owned)func; } public override uint? peek_count() { return null; } public override EnumerableInfo get_info() { return new EnumerableInfo.infer_single(this, EnumerableCategory.COMPUTED, input); } public override Tracker get_tracker() { var tracker = input.get_tracker(); var condition_met = false; return new AdvanceTracker((out obj) => { obj = null; do { if(!tracker.has_next()) { obj = null; return false; } obj = tracker.get_next (); } while(!condition_met && !predicate_func(obj)); condition_met = true; return true; }); } } }