From 5a5f92b1dcdb2ad778842d9ba8444ce367f7c9b1 Mon Sep 17 00:00:00 2001 From: Joe4evr Date: Mon, 8 Jan 2018 17:55:24 +0100 Subject: [PATCH] Add entity equality comparers --- src/Discord.Net.Core/Utils/Comparers.cs | 43 +++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/Discord.Net.Core/Utils/Comparers.cs diff --git a/src/Discord.Net.Core/Utils/Comparers.cs b/src/Discord.Net.Core/Utils/Comparers.cs new file mode 100644 index 000000000..f2fc6e952 --- /dev/null +++ b/src/Discord.Net.Core/Utils/Comparers.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; + +namespace Discord.Addons.Core +{ + public static class DiscordComparers + { + // TODO: simplify with '??=' slated for C# 8.0 + public static IEqualityComparer UserComparer => _userComparer ?? (_userComparer = new EntityEqualityComparer()); + public static IEqualityComparer GuildComparer => _guildComparer ?? (_guildComparer = new EntityEqualityComparer()); + public static IEqualityComparer ChannelComparer => _channelComparer ?? (_channelComparer = new EntityEqualityComparer()); + public static IEqualityComparer RoleComparer => _roleComparer ?? (_roleComparer = new EntityEqualityComparer()); + + private static IEqualityComparer _userComparer; + private static IEqualityComparer _guildComparer; + private static IEqualityComparer _channelComparer; + private static IEqualityComparer _roleComparer; + + private sealed class EntityEqualityComparer : EqualityComparer + where TEntity : IEntity + where TId : IEquatable + { + public override bool Equals(TEntity x, TEntity y) + { + bool xNull = x == null; + bool yNull = y == null; + + if (xNull && yNull) + return true; + + if (xNull ^ yNull) + return false; + + return x.Id.Equals(y.Id); + } + + public override int GetHashCode(TEntity obj) + { + return obj?.Id.GetHashCode() ?? 0; + } + } + } +}