Files
QWERTYkez.Mensura/QWERTYkez.Mensura/Units/Time.cs
2026-06-07 15:54:53 +07:00

61 lines
2.1 KiB
C#

namespace QWERTYkez.Mensura.Units;
/// <summary>
/// Base value is MilliSeconds
/// </summary>
[UnitGenerator, DebuggerDisplay("ms = {_MilliSeconds.ToString(\"0.###\")}, s = {Seconds.ToString(\"0.###\")}")]
public readonly partial record struct Time
{
public static Time _MilliSecond { get; } = new() { _MilliSeconds = 1 };
[NotMapped, JsonIgnore] public double _MilliSeconds { get => _Value; init => _Value = value; }
public static Time Second { get; } = new() { Seconds = 1 };
[NotMapped, JsonIgnore] public double Seconds
{
get => TimeConv.Seconds.From(_Value);
init
{
_Value = TimeConv.Seconds.To(value);
}
}
public static Time Minute { get; } = new() { Minutes = 1 };
[NotMapped, JsonIgnore] public double Minutes
{
get => TimeConv.Minutes.From(_Value);
init
{
_Value = TimeConv.Minutes.To(value);
}
}
public static Time Hour { get; } = new() { Hours = 1 };
[NotMapped, JsonIgnore] public double Hours
{
get => TimeConv.Hours.From(_Value);
init
{
_Value = TimeConv.Hours.To(value);
}
}
public Frequency ToFrequency() => new() { _Hertz = 1 / Seconds };
public Time AddMilliSeconds(double value) => new(_Value + value);
public Time AddSeconds(double value) => new(_Value + TimeConv.Seconds.To(value));
public Time AddMinutes(double value) => new(_Value + TimeConv.Minutes.To(value));
public Time AddHours(double value) => new(_Value + TimeConv.Hours.To(value));
}
internal readonly struct TimeConv
{
private TimeConv(double multiplicator) => this.Multiplicator = multiplicator;
public double To(double value) => value * Multiplicator;
public double From(double value) => value / Multiplicator;
public double Multiplicator { get; init; }
public static TimeConv MilliSeconds { get; } = new(1);
public static TimeConv Seconds { get; } = new(1000);
public static TimeConv Minutes { get; } = new(60000);
public static TimeConv Hours { get; } = new(3600000);
}