namespace Invercargill.Modifiers { public class Filter : Enumerable { private PredicateDelegate predicate_func; private Enumerable input; public Filter(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(); return new AdvanceTracker((out obj) => { while(tracker.has_next()) { var item = tracker.get_next(); if(predicate_func(item)){ obj = item; return true; } } obj = null; return false; }); } } }