You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

58 lines
2.7 KiB

using System;
using System.Collections.Generic;
namespace Discord
{
/// <summary>
/// Represents a collection of <see cref="IEqualityComparer{T}"/> for various Discord objects.
/// </summary>
public static class DiscordComparers
{
/// <summary>
/// Gets an <see cref="IEqualityComparer{T}"/> to be used to compare users.
/// </summary>
public static IEqualityComparer<IUser> UserComparer => _userComparer =_userComparer ?? new EntityEqualityComparer<IUser, ulong>();
/// <summary>
/// Gets an <see cref="IEqualityComparer{T}"/> to be used to compare guilds.
/// </summary>
public static IEqualityComparer<IGuild> GuildComparer => _guildComparer = _guildComparer ?? new EntityEqualityComparer<IGuild, ulong>();
/// <summary>
/// Gets an <see cref="IEqualityComparer{T}"/> to be used to compare channels.
/// </summary>
public static IEqualityComparer<IChannel> ChannelComparer => _channelComparer = _channelComparer ?? new EntityEqualityComparer<IChannel, ulong>();
/// <summary>
/// Gets an <see cref="IEqualityComparer{T}"/> to be used to compare roles.
/// </summary>
public static IEqualityComparer<IRole> RoleComparer => _roleComparer = _roleComparer ?? new EntityEqualityComparer<IRole, ulong>();
/// <summary>
/// Gets an <see cref="IEqualityComparer{T}"/> to be used to compare messages.
/// </summary>
public static IEqualityComparer<IMessage> MessageComparer => _messageComparer = _messageComparer ?? new EntityEqualityComparer<IMessage, ulong>();
private static IEqualityComparer<IUser> _userComparer;
private static IEqualityComparer<IGuild> _guildComparer;
private static IEqualityComparer<IChannel> _channelComparer;
private static IEqualityComparer<IRole> _roleComparer;
private static IEqualityComparer<IMessage> _messageComparer;
private sealed class EntityEqualityComparer<TEntity, TId> : EqualityComparer<TEntity>
where TEntity : IEntity<TId>
where TId : IEquatable<TId>
{
public override bool Equals(TEntity x, TEntity y)
{
if (x == null && y == null) return true;
if (x == null && y != null) return false;
if (x != null && y == null) return false;
var tuple = new Tuple<TEntity, TEntity>(x, y);
return tuple.Item1.Id.Equals(tuple.Item2.Id);
}
public override int GetHashCode(TEntity obj)
{
return obj?.Id.GetHashCode() ?? 0;
}
}
}
}