using Invercargill.DataStructures; namespace Invercargill.Modifiers { public class Unique : Enumerable { private Enumerable input; private EqualityDelegate comparison; private TransformDelegate selector; public Unique(Enumerable input, owned TransformDelegate selector, owned EqualityDelegate compare) { this.input = input; comparison = (owned)compare; this.selector = (owned)selector; } public override Tracker get_tracker() { var tracker = input.get_tracker(); var previous = new Vector(); return new AdvanceTracker((out item) => { while(true) { if(!tracker.has_next()) { item = null; return false; } var next = tracker.get_next(); if(previous.any(p => comparison(selector(p), selector(next)))) { continue; } previous.add(next); item = next; return true; } }); } } }