Skip to content

Example.ComparableTimestampedStruct

IzayoiJiichan edited this page Feb 1, 2025 · 1 revision

Examples

using Izayoi.Data.Comparable;
using Izayoi.Data.Packs;
using Izayoi.Data.TimestampedObjects;
using System;

public class Example()
{
    public void Method1()
    {
        ComparableTimestampedStruct<int> cts0 = new();

        // cts0.Timestamp: 0
        // cts0.Value: 0

        ComparableTimestampedStruct<int> cts1 = new(1);

        // cts1.Timestamp: (1234567890)
        // cts1.Value: 1

        long utcNow = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();

        ComparableTimestampedStruct<int> cts2 = new(utcNow, 2);

        // cts2.Timestamp: (utcNow)
        // cts2.Value: 2
    }

    // Izayoi.Data.Comparable.ComparableNullable<TValue>
    public void Method2()
    {
        // NG
        //ComparableTimestampedStruct<int?> cts1 = new(1);

        // NG
        //ComparableTimestampedStruct<System.Nullable<int>> cts1 = new(1);

        // OK
        ComparableTimestampedStruct<ComparableNullable<int>> cts1 = new(1);

        // cts1.Timestamp: (1234567890)
        // cts1.Value.HasValue: true
        // cts1.Value.Value: 1

        // OK
        ComparableTimestampedStruct<ComparableNullable<int>> ctsNull = new(null);

        // ctsNull.Timestamp: (1234567890)
        // ctsNull.Value.HasValue: false
    }

    public void Method3()
    {
        long utcNow = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();

        ComparableTimestampedStruct<int> cts1 = new(utcNow, 1);
        ComparableTimestampedStruct<int> cts2 = new(utcNow, 1);

        if (cts1 == cts2)
        {
            // true
        }
    }

    public void Method4()
    {
        long utcNow1 = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();

        ComparableTimestampedStruct<int> cts1 = new(utcNow1, 1);

        long utcNow2 = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();

        ComparableTimestampedStruct<int> cts2 = new(utcNow2, 1);

        if (cts1 < cts2)
        {
            // true (cts1.Timestamp < cts2.Timestamp)
        }
    }

    public void Method5()
    {
        long utcNow = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();

        ComparableTimestampedStruct<int> cts1 = new(utcNow, 1);
        ComparableTimestampedStruct<int> cts2 = new(utcNow, 2);

        if (cts1 < cts2)
        {
            // true
        }
    }

    // Izayoi.Data.Comparable.ComparableNullable<TValue>
    public void Method6()
    {
        long utcNow = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();

        ComparableTimestampedStruct<ComparableNullable<int>> cts1 = new(utcNow, null);
        ComparableTimestampedStruct<ComparableNullable<int>> cts2 = new(utcNow, 0);

        if (cts1 < cts2)
        {
            // true (null < 0)
        }
    }

    // Izayoi.Data.Comparable.ComparableStructPack<TValue1, ...>
    public void Method7()
    {
        long utcNow = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();

        ComparableTimestampedStruct<ComparableStructPack<int, long, int>> cts111 = new(utcNow, new(1, 1, 1));
        ComparableTimestampedStruct<ComparableStructPack<int, long, int>> cts112 = new(utcNow, new(1, 1, 2));

        if (cts111 < cts112)
        {
            // true
        }
    }

    public void Method8()
    {
        long utcNow = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();

        ComparableTimestampedStruct<ComparableSample2Struct> cts11 = new(utcNow, new(1, 1));
        ComparableTimestampedStruct<ComparableSample2Struct> cts12 = new(utcNow, new(1, 2));

        if (cts11 < cts12)
        {
            // true
        }
    }
}

public readonly struct ComparableSample2Struct :
    IComparable<ComparableSample2Struct>,
    IEquatable<ComparableSample2Struct>
{
    private readonly int value1;

    private readonly int value2;

    public ComparableSample2Struct(int value1, int value2)
    {
        this.value1 = value1;
        this.value2 = value2;
    }

    public readonly int Value1 => value1;

    public readonly int Value2 => value2;

    public int CompareTo(ComparableSample2Struct other)
    {
        //if (other is null)
        //{
        //    return 1;
        //}

        int compared1 = Value1.CompareTo(other.Value1);

        if (compared1 != 0)
        {
            return compared1;
        }

        int compared2 = Value2.CompareTo(other.Value2);

        if (compared2 != 0)
        {
            return compared2;
        }

        return 0;
    }

    public bool Equals(ComparableSample2Struct other)
    {
        //if (other is null)
        //{
        //    return false;
        //}

        return
            Value1.Equals(other.Value1) &&
            Value2.Equals(other.Value2);
    }
}
Clone this wiki locally