SymmetricDifference.vala 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. using Invercargill.DataStructures;
  2. namespace Invercargill.Modifiers {
  3. public class SymmetricDifference<T, TKey> : Enumerable<T> {
  4. private Enumerable<T> e1;
  5. private Enumerable<T> e2;
  6. private TransformDelegate<T, TKey> key_sf;
  7. private HashDelegate<TKey> key_hf;
  8. private EqualityDelegate<TKey> key_ef;
  9. public SymmetricDifference(Enumerable<T> first, Enumerable<T> second, owned TransformDelegate<T, TKey> key_selector, owned HashDelegate<TKey>? key_hasher = null, owned EqualityDelegate<TKey>? key_equator = null) {
  10. e1 = first;
  11. e2 = second;
  12. key_sf = (owned)key_selector;
  13. key_ef = (owned)key_equator ?? Operators.equality<TKey>();
  14. key_hf = (owned)key_hasher ?? Operators.hash<TKey>();
  15. }
  16. public override int? peek_count() {
  17. return null;
  18. }
  19. public override EnumerableInfo get_info() {
  20. return new EnumerableInfo.infer(this, EnumerableCategory.COMPUTED, Iterate.these(e1, e2));
  21. }
  22. public override Tracker<T> get_tracker() {
  23. var result = e1.to_hash_set(i => key_hf(key_sf(i)), (a, b) => key_ef(key_sf(a), key_sf(b)));
  24. result.symmetric_except_with(e2);
  25. return result.get_tracker();
  26. }
  27. }
  28. }