Timestamped<T>
Represents value with a timestamp on it.
            The timestamp typically represents the time the value was received, using an IScheduler's clock to obtain the current time.
            
                using System.Collections.Generic;
using System.Globalization;
using System.Runtime.CompilerServices;
namespace System.Reactive
{
    [Serializable]
    [System.Runtime.CompilerServices.NullableContext(1)]
    [System.Runtime.CompilerServices.Nullable(0)]
    public readonly struct Timestamped<[System.Runtime.CompilerServices.Nullable(2)] T> : IEquatable<Timestamped<T>>
    {
        public T Value { get; }
        public DateTimeOffset Timestamp { get; }
        public Timestamped(T value, DateTimeOffset timestamp)
        {
            Timestamp = timestamp;
            Value = value;
        }
        public void Deconstruct(out T value, out DateTimeOffset timestamp)
        {
            T value2 = Value;
            DateTimeOffset timestamp2 = Timestamp;
            value = value2;
            timestamp = timestamp2;
        }
        public bool Equals([System.Runtime.CompilerServices.Nullable(new byte[] {
            0,
            1
        })] Timestamped<T> other)
        {
            if (other.Timestamp.Equals(Timestamp))
                return EqualityComparer<T>.Default.Equals(Value, other.Value);
            return false;
        }
        public static bool operator ==([System.Runtime.CompilerServices.Nullable(new byte[] {
            0,
            1
        })] Timestamped<T> first, [System.Runtime.CompilerServices.Nullable(new byte[] {
            0,
            1
        })] Timestamped<T> second)
        {
            return first.Equals(second);
        }
        public static bool operator !=([System.Runtime.CompilerServices.Nullable(new byte[] {
            0,
            1
        })] Timestamped<T> first, [System.Runtime.CompilerServices.Nullable(new byte[] {
            0,
            1
        })] Timestamped<T> second)
        {
            return !first.Equals(second);
        }
        [System.Runtime.CompilerServices.NullableContext(2)]
        public override bool Equals(object obj)
        {
            if (obj is Timestamped<T>) {
                Timestamped<T> other = (Timestamped<T>)obj;
                return Equals(other);
            }
            return false;
        }
        public override int GetHashCode()
        {
            int hashCode = Timestamp.GetHashCode();
            T value = Value;
            return hashCode ^ (value?.GetHashCode() ?? 1979);
        }
        public override string ToString()
        {
            return string.Format(CultureInfo.CurrentCulture, "{0}@{1}", Value, Timestamp);
        }
    }
}