// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the Apache 2.0 License.
// See the LICENSE file in the project root for more information. 
using System.Collections.Generic;
namespace System.Reactive
{
    /// 
    /// Represents a .NET event invocation consisting of the weakly typed object that raised the event and the data that was generated by the event.
    ///  
    /// The type of the event data generated by the event. 
    public class EventPattern : EventPattern
#if !NO_EVENTARGS_CONSTRAINT
        where TEventArgs : EventArgs
#endif
    {
        /// 
        /// Creates a new data representation instance of a .NET event invocation with the given sender and event data.
        ///  
        /// 
    /// Represents a .NET event invocation consisting of the strongly typed object that raised the event and the data that was generated by the event.
    ///  
    /// The type of the sender that raised the event. 
    /// The type of the event data generated by the event. 
    public class EventPattern : IEquatable>, IEventPattern
#if !NO_EVENTARGS_CONSTRAINT
        where TEventArgs : EventArgs
#endif
    {
        /// 
        /// Creates a new data representation instance of a .NET event invocation with the given sender and event data.
        ///  
        /// 
        /// Gets the sender object that raised the event.
        ///  
        public TSender Sender { get; private set; }
        /// 
        /// Gets the event data that was generated by the event.
        ///  
        public TEventArgs EventArgs { get; private set; }
        /// 
        /// Determines whether the current EventPattern<TSender, TEventArgs> object represents the same event as a specified EventPattern<TSender, TEventArgs> object.
        ///  
        /// true if both EventPattern<TSender, TEventArgs> objects represent the same event; otherwise, false. 
        public bool Equals(EventPattern other)
        {
            if (object.ReferenceEquals(null, other))
                return false;
            if (object.ReferenceEquals(this, other))
                return true;
            return EqualityComparer.Default.Equals(Sender, other.Sender) && EqualityComparer.Default.Equals(EventArgs, other.EventArgs);
        }
        /// 
        /// Determines whether the specified System.Object is equal to the current EventPattern<TSender, TEventArgs>.
        ///  
        /// true if the specified System.Object is equal to the current EventPattern<TSender, TEventArgs>; otherwise, false. 
        public override bool Equals(object obj)
        {
            return Equals(obj as EventPattern);
        }
        /// 
        /// Returns the hash code for the current EventPattern<TSender, TEventArgs> instance.
        ///  
        /// A hash code for the current EventPattern<TSender, TEventArgs> instance. 
        public override int GetHashCode()
        {
            var x = EqualityComparer.Default.GetHashCode(Sender);
            var y = EqualityComparer.Default.GetHashCode(EventArgs);
            return (x << 5) + (x ^ y);
        }
        /// 
        /// Determines whether two specified EventPattern<TSender, TEventArgs> objects represent the same event.
        ///  
        /// true if both EventPattern<TSender, TEventArgs> objects represent the same event; otherwise, false. 
        public static bool operator ==(EventPattern first, EventPattern second)
        {
            return object.Equals(first, second);
        }
        /// 
        /// Determines whether two specified EventPattern<TSender, TEventArgs> objects represent a different event.
        ///  
        /// true if both EventPattern<TSender, TEventArgs> objects don't represent the same event; otherwise, false. 
        public static bool operator !=(EventPattern first, EventPattern second)
        {
            return !object.Equals(first, second);
        }
    }
}