using Invercargill.DataStructures; namespace Invercargill.Modifiers { public class SymmetricDifference : Enumerable { private Enumerable e1; private Enumerable e2; private TransformDelegate key_sf; private HashDelegate key_hf; private EqualityDelegate key_ef; public SymmetricDifference(Enumerable first, Enumerable second, owned TransformDelegate key_selector, owned HashDelegate? key_hasher = null, owned EqualityDelegate? key_equator = null) { e1 = first; e2 = second; key_sf = (owned)key_selector; key_ef = (owned)key_equator ?? Operators.equality(); key_hf = (owned)key_hasher ?? Operators.hash(); } public override int? peek_count() { return null; } public override EnumerableInfo get_info() { return new EnumerableInfo.infer(this, EnumerableCategory.COMPUTED, Iterate.these(e1, e2)); } public override Tracker get_tracker() { var result = e1.to_hash_set(i => key_hf(key_sf(i)), (a, b) => key_ef(key_sf(a), key_sf(b))); result.symmetric_except_with(e2); return result.get_tracker(); } } }