2020-04-20 13:00:20 +00:00
# Changelog
2023-03-23 13:38:38 +00:00
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog ](https://keepachangelog.com/en/1.0.0/ ),
and this project adheres to [Semantic Versioning ](https://semver.org/spec/v2.0.0.html ).
2024-11-13 18:22:36 +00:00
## 4.0.1 - [Unreleased]
2024-11-14 16:01:11 +00:00
### Changed
- X10D: Removed `byte.Product` , `short.Product` , `ushort.Product` , `int.Product` , `uint.Product` , `long.Product` ,
and `ulong.Product` , in favour of `INumber<T>.Product` .
- X10D: Removed `byte.RangeTo` , `short.RangeTo` , `ushort.RangeTo` , `int.RangeTo` , `uint.RangeTo` , `long.RangeTo` ,
and `ulong.RangeTo` , in favour of `INumber<T>.RangeTo` .
2024-11-13 18:22:36 +00:00
### Removed
- X10D: Removed `Span<T>.Split` for .NET 9.0 target due to conflicts with
[`System.MemoryExtensions.Split` ](https://learn.microsoft.com/en-us/dotnet/api/system.memoryextensions.split?view=net-8.0 ).
## [4.0.0] - 2024-06-12
2023-04-03 17:20:21 +00:00
2023-04-04 09:10:55 +00:00
### Added
2023-04-10 11:44:53 +00:00
2024-06-12 12:44:11 +00:00
- X10D: Add support for generic math interfaces.
2023-04-04 09:10:55 +00:00
- X10D: Added extension methods for `DateOnly` , for parity with `DateTime` and `DateTimeOffset` .
2023-04-05 10:05:53 +00:00
- X10D: Added math-related extension methods for `BigInteger` .
2024-06-12 13:06:54 +00:00
- X10D: Added `Queue<T>.EnqueueAll` and `Queue<T>.DequeueAll` .
- X10D: Added `Stack<T>.PushAll` and `Stack<T>.PopAll` .
2023-04-06 01:31:22 +00:00
- X10D: Added `Span<T>.Replace(T, T)` .
2023-04-06 13:40:27 +00:00
- X10D: Added `CountDigits` for integer types.
2023-04-13 19:55:24 +00:00
- X10D: Added `IEnumerable<T>.Except(T)` .
- X10D: Added `Progress<T>.OnProgressChanged([T])` .
2023-04-06 18:11:54 +00:00
- X10D: Added `TextWriter.WriteNoAlloc(int[, ReadOnlySpan<char>[, IFormatProvider]])` .
- X10D: Added `TextWriter.WriteNoAlloc(uint[, ReadOnlySpan<char>[, IFormatProvider]])` .
- X10D: Added `TextWriter.WriteNoAlloc(long[, ReadOnlySpan<char>[, IFormatProvider]])` .
- X10D: Added `TextWriter.WriteNoAlloc(ulong[, ReadOnlySpan<char>[, IFormatProvider]])` .
- X10D: Added `TextWriter.WriteLineNoAlloc(int[, ReadOnlySpan<char>[, IFormatProvider]])` .
- X10D: Added `TextWriter.WriteLineNoAlloc(uint[, ReadOnlySpan<char>[, IFormatProvider]])` .
- X10D: Added `TextWriter.WriteLineNoAlloc(long[, ReadOnlySpan<char>[, IFormatProvider]])` .
- X10D: Added `TextWriter.WriteLineNoAlloc(ulong[, ReadOnlySpan<char>[, IFormatProvider]])` .
2024-06-12 02:40:34 +00:00
- X10D: Added `Range.GetEnumerator` (and `RangeEnumerator` ), implementing Python-esque `for` loops in C#.
2023-04-14 12:55:52 +00:00
- X10D: Added `string.ConcatIf` .
2023-08-27 02:37:01 +00:00
- X10D: Added `string.MDBold` , `string.MDCode` , `string.MDCodeBlock([string])` , `string.MDHeading(int)` ,
`string.MDItalic` , `string.MDLink` , `string.MDStrikeOut` , and `string.MDUnderline` for Markdown formatting.
2023-08-27 12:58:15 +00:00
- X10D: Added Span overloads which complement `char.Repeat` and `string.Repeat` .
2023-04-04 09:10:55 +00:00
2023-08-22 22:53:13 +00:00
### Fixed
- X10D: Fixed XMLDoc for `Line3D` to read "single-precision floating-point" instead of "32-bit signed integer".
2023-04-03 17:20:21 +00:00
### Changed
2023-04-10 11:44:53 +00:00
2023-08-09 14:24:33 +00:00
- X10D: DateTime.Age(DateTime) and DateTimeOffset.Age(DateTimeOffset) parameter renamed from asOf to referenceDate.
2023-08-23 13:15:52 +00:00
- X10D: Methods which accepted the `Endianness` enum as an argument have been replaced with explicit
BigEndian/LittleEndian methods.
2023-08-23 13:17:42 +00:00
- X10D: `Stream.GetHash<>` and `Stream.TryWriteHash<>` now throw ArgumentException in lieu of
TypeInitializationException.
2024-06-12 03:00:25 +00:00
- X10D: `char.IsEmoji` no longer allocates for .NET 7+.
2023-08-27 12:58:15 +00:00
- X10D: `string.Repeat` is now more efficient.
2023-04-03 17:20:21 +00:00
2023-05-14 15:27:42 +00:00
### Removed
2023-08-09 14:24:33 +00:00
- X10D: Removed `IEnumerable<T>.ConcatOne` - this functionality already exists with `Append` .
2023-08-23 13:15:52 +00:00
- X10D: Removed `Endianness` enum.
2023-11-14 16:55:04 +00:00
- X10D: Removed `Span<T>.Replace(T, T)` for .NET 8 target.
2023-09-12 23:47:56 +00:00
- X10D: Removed .NET Standard 2.1 target.
2024-06-12 03:00:25 +00:00
- X10D: Removed extensions for `Progress<T>` . These are already provided by [`Observable.FromEventPattern` ](https://learn.microsoft.com/en-us/previous-versions/dotnet/reactive-extensions/hh229424(v=vs.103 )).
2023-09-12 23:47:56 +00:00
- X10D.Hosting: Removed .NET Standard 2.1 target.
2023-09-12 23:22:37 +00:00
- X10D.DSharpPlus: Complete sunset of library. This library will not be updated to support DSharpPlus v5.0.0 (#83).
- X10D.Unity: Complete sunset of library. This library will not be updated effective immediately (#86).
2023-08-09 14:24:33 +00:00
2023-08-21 16:39:35 +00:00
## [3.3.1] - 2023-08-21
### Fixed
2024-06-12 10:57:27 +00:00
- X10D: Fixed `decimal.TryWriteBigEndianBytes` and `decimal.TryWriteLittleEndianBytes` .
2023-08-21 16:39:35 +00:00
- X10D.Hosting: Fixed `AddHostedSingleton` not accepting an interface as the service type.
2023-08-21 16:25:41 +00:00
## [3.3.0] - 2023-08-21
### Added
- X10D.Hosting: Added support for service/implementation registration with `AddHostedSingleton` .
2023-06-05 20:47:04 +00:00
## [3.2.2] - 2023-06-05
### Added
- X10D.DSharpPlus: Added support for new usernames. See https://discord.com/blog/usernames
## 3.2.1 - 2023-06-05
ERRONEOUS RELEASE.
2023-05-14 15:27:42 +00:00
2023-04-03 17:17:40 +00:00
## [3.2.0] - 2023-04-03
2023-03-23 13:38:38 +00:00
2022-05-16 09:30:55 +00:00
### Added
2023-03-23 13:38:38 +00:00
2023-03-23 13:53:12 +00:00
- Added new library X10D.DSharpPlus.
- Added new library X10D.Hosting.
- Added .NET 7 target.
2023-03-23 13:54:38 +00:00
- X10D: Added `IntrinsicExtensions` and `IntrinsicUtility` which offer methods for vectors in `System.Runtime.Instrinsics` . (#70)
2023-04-03 14:47:18 +00:00
- X10D: Added `MathUtility.Bias(float, float)` and `MathUtility.Bias(double, double)` .
2023-04-03 15:21:43 +00:00
- X10D: Added `MathUtility.ExponentialDecay(float, float, float)` and `MathUtility.ExponentialDecay(double, double, double)` .
2023-04-03 15:38:58 +00:00
- X10D: Added `MathUtility.InverseLerp(float, float, float)` and `MathUtility.InverseLerp(double, double, double)` .
2023-04-03 16:29:45 +00:00
- X10D: Added `MathUtility.Pulse(float, float, float)` and `MathUtility.Pulse(double, double, double)` .
2023-04-03 16:15:11 +00:00
- X10D: Added `MathUtility.Sawtooth(float)` and `MathUtility.Sawtooth(double)` .
2023-03-23 13:38:38 +00:00
- X10D: Added `MathUtility.ScaleRange(float, float, float, float, float)`
and `MathUtility.ScaleRange(double, double, double, double, double)`
2023-04-03 15:38:58 +00:00
- X10D: Added `MathUtility.Sigmoid(float)` and `MathUtility.Sigmoid(double)` .
2023-04-03 14:47:18 +00:00
- X10D: Added `MathUtility.SmoothStep(float, float, float)` and `MathUtility.SmoothStep(double, double, double)` .
2023-04-03 15:38:58 +00:00
- X10D: Added `Circle` , `CircleF` , `Cuboid` , `Ellipse` , `EllipseF` , `Line3D` , `Line` , `LineF` , `Polygon` , `PolygonF` , `Polyhedron` ,
and `Sphere` , to complement System.Drawing structs such as `Point` and `Rectangle` .
2023-03-23 13:53:12 +00:00
- X10D: Added `Color.Deconstruct()` - with optional alpha parameter.
- X10D: Added `Color.GetClosestConsoleColor()` .
- X10D: Added `DateTime.GetIso8601WeekOfYear()` and `DateTimeOffset.GetIso8601WeekOfYear()` .
- X10D: Added `DirectoryInfo.Clear()` .
- X10D: Added `double.LinearToGamma([gamma])` and `float.LinearToGamma([gamma])` . (#60)
- X10D: Added `double.GammaToLinear([gamma])` and `float.GammaToLinear([gamma])` . (#60)
- X10D: Added `GreatestCommonFactor` for built-in integer types.
2023-03-31 13:53:02 +00:00
- X10D: Added `IEnumerable<T>.ConcatOne(T)` .
2023-03-23 13:53:12 +00:00
- X10D: Added `IEnumerable<T>.CountWhereNot(Func<T, bool>)` .
- X10D: Added `IEnumerable<T>.FirstWhereNot(Func<T, bool>)` .
- X10D: Added `IEnumerable<T>.FirstWhereNotOrDefault(Func<T, bool>)` .
- X10D: Added `IEnumerable<T>.LastWhereNot(Func<T, bool>)` .
- X10D: Added `IEnumerable<T>.LastWhereNotOrDefault(Func<T, bool>)` .
2023-03-26 16:24:20 +00:00
- X10D: Added `IEnumerable<T>.MinMax()` and `IEnumerable<T>.MinMaxBy()` . (#72)
2023-03-23 13:53:12 +00:00
- X10D: Added `IEnumerable<T>.WhereNot(Func<T, bool>)` .
- X10D: Added `IEnumerable<T>.WhereNotNull()` .
2023-03-30 16:29:54 +00:00
- X10D: Added `IEnumerable<string>.Grep(string[, bool])` .
2023-03-23 13:53:12 +00:00
- X10D: Added `IList<T>.RemoveRange(Range)` .
- X10D: Added `IList<T>.Swap(IList<T>)` . (#62)
- X10D: Added `IReadOnlyList<T>.IndexOf(T[, int[, int]])` .
- X10D: Added `IReadOnlyList<T>.Slice(int[, int]])` .
- X10D: Added `LowestCommonMultiple` for built-in integer types.
- X10D: Added `Wrap(T[, T])` for built-in numeric types. (#60)
- X10D: Added `Nullable<T>.TryGetValue(out T)` . (#61)
- X10D: Added `Point.IsOnLine(LineF)` , `Point.IsOnLine(PointF, PointF)` , and `Point.IsOnLine(Vector2, Vector2)` .
- X10D: Added `PointF.IsOnLine(LineF)` , `PointF.IsOnLine(PointF, PointF)` , and `PointF.IsOnLine(Vector2, Vector2)` .
- X10D: Added `Point.ToSize()` .
- X10D: Added `Point.ToSizeF()` .
- X10D: Added `Point.ToVector2()` .
- X10D: Added `PointF.Round([float])` .
- X10D: Added `PointF.ToSizeF()` .
- X10D: Added `PointF.ToVector2()` for .NET < 6.
- X10D: Added `PopCount()` for built-in integer types.
- X10D: Added `Quaternion.ToAxisAngle(out float, out float)` .
- X10D: Added `Quaternion.ToVector3()` .
- X10D: Added `Random.NextFrom(Span<T>)` and `Random.NextFrom(ReadOnlySpan<T>)` .
- X10D: Added `ReadOnlySpan<char>.CountSubstring(char)` .
- X10D: Added `ReadOnlySpan<char>.CountSubstring(ReadOnlySpan<char>[, StringComparison])` .
- X10D: Added `ReadOnlySpan<char>.ToTimeSpan()` .
- X10D: Added `ReadOnlySpan<T>.Split(T)` .
- X10D: Added `ReadOnlySpan<T>.Split(ReadOnlySpan<T>)` .
- X10D: Added `RoundUpToPowerOf2()` for built-in integer types.
2023-03-29 15:21:16 +00:00
- X10D: Added `Saturate()` for built-in floating-point types.
2023-03-23 13:53:12 +00:00
- X10D: Added `Size.ToPoint()` .
- X10D: Added `Size.ToPointF()` .
- X10D: Added `Size.ToVector2()` .
- X10D: Added `Span<char>.CountSubstring(char)` .
- X10D: Added `Span<char>.CountSubstring(Span<char>[, StringComparison])` .
- X10D: Added `Span<T>.Split(T)` .
- X10D: Added `Span<T>.Split(Span<T>)` .
- X10D: Added `string.CountSubstring(char)` .
- X10D: Added `string.CountSubstring(string[, StringComparison])` .
2023-03-30 01:09:04 +00:00
- X10D: Added `string.EnsureStartsWith()` and `string.EnsureEndsWith()` .
2023-03-23 13:53:12 +00:00
- X10D: Added `string.IsEmpty()` .
- X10D: Added `string.IsWhiteSpace()` .
- X10D: Added `string.IsNullOrEmpty()` .
- X10D: Added `string.IsNullOrWhiteSpace()` .
2023-03-30 16:55:41 +00:00
- X10D: Added `TextReader.EnumerateLines()` and `TextReader.EnumerateLinesAsync()` .
2023-03-23 13:53:12 +00:00
- X10D: Added `TimeSpan.TryParse(ReadOnlySpan<char>, out TimeSpan)` .
- X10D: Added `Quaternion.Multiply(Vector3)` - this functions as an equivalent to Unity's `Quaternion * Vector3` operator.
- X10D: Added `Vector2.Deconstruct()` .
- X10D: Added `Vector2.IsOnLine(LineF)` , `Vector2.IsOnLine(PointF, PointF)` , and `Vector2.IsOnLine(Vector2, Vector2)` .
- X10D: Added `Vector2.Round([float])` .
- X10D: Added `Vector2.ToPointF()` .
- X10D: Added `Vector2.ToSizeF()` .
- X10D: Added `Vector3.Deconstruct()` .
- X10D: Added `Vector3.Round([float])` .
- X10D: Added `Vector4.Deconstruct()` .
- X10D: Added `Vector4.Round([float])` .
2023-04-01 17:54:04 +00:00
- X10D: `ComplexSqrt` is now exposed for all frameworks.
2023-04-02 02:10:36 +00:00
- X10D.Unity: Added `DebugUtility` , which mimics `UnityEngine.Debug` while offering more useful primitive drawing methods.
2023-03-23 13:53:12 +00:00
- X10D.Unity: Added `System.Drawing.Color.ToUnityColor()` .
- X10D.Unity: Added `System.Drawing.Color.ToUnityColor32()` .
- X10D.Unity: Added `Color.Deconstruct()` - with optional alpha parameter.
- X10D.Unity: Added `Color.GetClosestConsoleColor()` .
- X10D.Unity: Added `Color.ToSystemDrawingColor()` .
- X10D.Unity: Added `Color32.Deconstruct()` - with optional alpha parameter.
- X10D.Unity: Added `Color32.GetClosestConsoleColor()` .
- X10D.Unity: Added `Color32.ToSystemDrawingColor()` .
- X10D.Unity: Added `Point.ToUnityVector2()` .
- X10D.Unity: Added `Point.ToUnityVector2Int()` .
- X10D.Unity: Added `PointF.ToUnityVector2()` .
- X10D.Unity: Added `Rect.ToSystemRectangleF()` .
- X10D.Unity: Added `RectInt.ToSystemRectangle()` .
- X10D.Unity: Added `RectInt.ToSystemRectangleF()` .
- X10D.Unity: Added `Rectangle.ToUnityRect()` .
- X10D.Unity: Added `Rectangle.ToUnityRectInt()` .
- X10D.Unity: Added `RectangleF.ToUnityRect()` .
- X10D.Unity: Added `Size.ToUnityVector2()` .
- X10D.Unity: Added `Size.ToUnityVector2Int()` .
- X10D.Unity: Added `SizeF.ToUnityVector2()` .
- X10D.Unity: Added `Vector2.Deconstruct()` .
- X10D.Unity: Added `Vector2.IsOnLine(LineF)` , `Vector2.IsOnLine(PointF, PointF)` , and `Vector2.IsOnLine(Vector2, Vector2)` .
2023-03-23 13:38:38 +00:00
- X10D.Unity: Added `Vector2Int.IsOnLine(LineF)` , `Vector2Int.IsOnLine(PointF, PointF)` , `Vector2Int.IsOnLine(Vector2, Vector2)` ,
2023-03-23 13:53:12 +00:00
and `Vector2Int.IsOnLine(Vector2Int, Vector2Int)` .
- X10D.Unity: Added `Vector2.Round([float])` .
- X10D.Unity: Added `Vector2.ToSystemPointF()` .
- X10D.Unity: Added `Vector2.ToSystemSizeF()` .
- X10D.Unity: Added `Vector2Int.Deconstruct()` .
- X10D.Unity: Added `Vector2Int.ToSystemPoint()` .
- X10D.Unity: Added `Vector2Int.ToSystemSize()` .
- X10D.Unity: Added `Vector2Int.ToSystemVector()` .
- X10D.Unity: Added `Vector2Int.WithX()` .
- X10D.Unity: Added `Vector2Int.WithY()` .
- X10D.Unity: Added `Vector3.Deconstruct()` .
- X10D.Unity: Added `Vector3.Round([float])` .
- X10D.Unity: Added `Vector3Int.Deconstruct()` .
- X10D.Unity: Added `Vector3Int.ToSystemVector()` .
- X10D.Unity: Added `Vector3Int.WithX()` .
- X10D.Unity: Added `Vector3Int.WithY()` .
- X10D.Unity: Added `Vector3Int.WithZ()` .
- X10D.Unity: Added `Vector4.Deconstruct()` .
2022-07-13 11:09:37 +00:00
- X10D.Unity: Added `Vector4.Round([float])`
2023-03-23 13:53:12 +00:00
- X10D.Unity: Added `WaitForFrames` yield instruction.
- X10D.Unity: Added `WaitForKeyDown` yield instruction.
- X10D.Unity: Added `WaitForKeyUp` yield instruction.
- X10D.Unity: Added `WaitForSecondsNoAlloc` yield instruction.
- X10D.Unity: Added `WaitForSecondsRealtimeNoAlloc` yield instruction.
- X10D.Unity: Added `WaitForTimeSpanNoAlloc` yield instruction.
- X10D.Unity: Added `WaitForTimeSpanRealtimeNoAlloc` yield instruction.
### Fixed
- X10D: `T[].Clear` will now correctly clear the specified range of elements by
using the [GetOffsetAndLength ](https://learn.microsoft.com/en-us/dotnet/api/system.range.getoffsetandlength?view=net-7.0 )
method.
2023-04-01 16:08:34 +00:00
- X10D: `Stream.ReadSingle(Endianness)` now returns a float instead of a double.
2023-04-01 16:11:05 +00:00
- X10D: Fixed `Stream.ReadDouble(Endianness)` , `Stream.ReadSingle(Endianness)` , `Stream.WriteDouble(double, Endianness)` ,
`Stream.WriteSingle(float, Endianness)` writing and reading the wrong endianness.
2022-05-16 09:30:55 +00:00
2022-05-31 10:52:59 +00:00
### Changed
2023-03-23 13:38:38 +00:00
2023-03-23 13:54:38 +00:00
- X10D: Performance for integer `Unpack` has been dramatically improved using vector parallelization. (#70)
- X10D: Performance for `MemberInfo.HasCustomAttribute` has been improved. (#70)
- X10D: Performance for `Rune.Repeat` has been improved. (#70)
2023-03-23 13:53:12 +00:00
- X10D: `TimeSpanParser.TryParse` now accepts a nullable string, and returns false if this input is null or empty.
- X10D.Unity: `Singleton<T>` now caches instance where possible.
- X10D.Unity: Conversions between equivalent structures in `System.Numerics` and `UnityEngine` now make use of "unsafe"
2023-03-23 13:54:38 +00:00
reinterpretation, rather than constructing new instances. (#70)
2022-05-31 10:52:59 +00:00
2023-03-23 13:38:38 +00:00
## [3.1.0] - 2022-05-13
2022-05-05 17:06:23 +00:00
### Added
2023-03-23 13:38:38 +00:00
2022-05-08 19:22:06 +00:00
- Reintroduced Unity support
2023-03-23 13:53:12 +00:00
- X10D: Added `Color.Inverted()` . (#54)
- X10D: Added `Color.WithA()` . (#55)
- X10D: Added `Color.WithB()` . (#55)
- X10D: Added `Color.WithG()` . (#55)
- X10D: Added `Color.WithR()` . (#55)
- X10D: Added `ICollection<T>.ClearAndDisposeAll()` .
- X10D: Added `ICollection<T>.ClearAndDisposeAllAsync()` .
- X10D: Added `IEnumerable<T>.For()` . (#50)
- X10D: Added `IEnumerable<T>.ForEach()` . (#50)
- X10D: Added `IEnumerable<T>.DisposeAll()` .
- X10D: Added `IEnumerable<T>.DisposeAllAsync()` .
- X10D: Added `char.IsEmoji` .
- X10D: Added `ReadOnlySpan<T>.Count(Predicate<T>)` .
- X10D: Added `Rune.IsEmoji` .
- X10D: Added `Span<T>.Count(Predicate<T>)` .
- X10D: Added `string.IsEmoji` .
- X10D: Added `Vector2.WithX()` . (#56)
- X10D: Added `Vector2.WithY()` . (#56)
- X10D: Added `Vector3.WithX()` . (#56)
- X10D: Added `Vector3.WithY()` . (#56)
- X10D: Added `Vector3.WithZ()` . (#56)
- X10D: Added `Vector4.WithX()` . (#56)
- X10D: Added `Vector4.WithY()` . (#56)
- X10D: Added `Vector4.WithZ()` . (#56)
- X10D: Added `Vector4.WithW()` . (#56)
- X10D.Unity: Added `Singleton<T>` class.
- X10D.Unity: Added `Color.Inverted()` . (#54)
- X10D.Unity: Added `Color.WithA()` . (#55)
- X10D.Unity: Added `Color.WithB()` . (#55)
- X10D.Unity: Added `Color.WithG()` . (#55)
- X10D.Unity: Added `Color.WithR()` . (#55)
- X10D.Unity: Added `Color32.Inverted()` . (#54)
- X10D.Unity: Added `Color32.WithA()` . (#55)
- X10D.Unity: Added `Color32.WithB()` . (#55)
- X10D.Unity: Added `Color32.WithG()` . (#55)
- X10D.Unity: Added `Color32.WithR()` . (#55)
- X10D.Unity: Added `Component.GetComponentsInChildrenOnly<T>()` .
- X10D.Unity: Added `GameObject.GetComponentsInChildrenOnly<T>()` .
- X10D.Unity: Added `GameObject.LookAt(GameObject[, Vector3])` .
- X10D.Unity: Added `GameObject.LookAt(Transform[, Vector3])` .
- X10D.Unity: Added `GameObject.LookAt(Vector3[, Vector3])` .
- X10D.Unity: Added `GameObject.SetLayerRecursively(int)` . (#57)
- X10D.Unity: Added `GameObject.SetParent(GameObject[, bool])` .
- X10D.Unity: Added `GameObject.SetParent(Transform[, bool])` .
- X10D.Unity: Added `System.Numerics.Quaternion.ToUnityQuaternion()` .
- X10D.Unity: Added `Quaternion.ToSystemQuaternion()` .
- X10D.Unity: Added `Random.NextColorArgb()` .
- X10D.Unity: Added `Random.NextColor32Argb()` .
- X10D.Unity: Added `Random.NextColorRgb()` .
- X10D.Unity: Added `Random.NextColor32Rgb()` .
- X10D.Unity: Added `Random.NextRotation()` .
- X10D.Unity: Added `Random.NextRotationUniform()` .
- X10D.Unity: Added `Random.NextUnitVector2()` .
- X10D.Unity: Added `Random.NextUnitVector3()` .
- X10D.Unity: Added `Transform.LookAt(GameObject[, Vector3])` .
- X10D.Unity: Added `Transform.SetParent(GameObject[, bool])` .
- X10D.Unity: Added `System.Numerics.Vector2.ToUnityVector()` .
- X10D.Unity: Added `System.Numerics.Vector3.ToUnityVector()` .
- X10D.Unity: Added `System.Numerics.Vector4.ToUnityVector()` .
- X10D.Unity: Added `Vector2.ToSystemVector()` .
- X10D.Unity: Added `Vector3.ToSystemVector()` .
- X10D.Unity: Added `Vector4.ToSystemVector()` .
- X10D.Unity: Added `Vector2.WithX()` . (#56)
- X10D.Unity: Added `Vector2.WithY()` . (#56)
- X10D.Unity: Added `Vector3.WithX()` . (#56)
- X10D.Unity: Added `Vector3.WithY()` . (#56)
- X10D.Unity: Added `Vector3.WithZ()` . (#56)
- X10D.Unity: Added `Vector4.WithX()` . (#56)
- X10D.Unity: Added `Vector4.WithY()` . (#56)
- X10D.Unity: Added `Vector4.WithZ()` . (#56)
- X10D.Unity: Added `Vector4.WithW()` . (#56)
2022-05-05 17:06:23 +00:00
2023-03-23 13:38:38 +00:00
## [3.0.0] - 2022-04-30
2022-04-30 13:07:13 +00:00
2023-03-23 13:38:38 +00:00
In the midst of writing these release notes, I may have missed some important changes. If you notice an API change that is not
documented here,
2022-04-30 13:07:13 +00:00
please [open an issue ](https://github.com/oliverbooth/X10D/issues )!
2022-04-21 21:06:44 +00:00
### Added
2023-03-23 13:38:38 +00:00
2023-03-23 13:53:12 +00:00
- Added `T.AsArrayValue()` .
- Added `T.AsEnumerableValue()` .
- Added `T.RepeatValue(int)` .
- Added `T.ToJson([JsonSerializerOptions])` .
- Added `string.FromJson([JsonSerializerOptions])` .
- Added `T[].AsReadOnly()` .
- Added `T[].Clear([Range])` and `T[].Clear(int, int)` .
- Added `DateTime.IsLeapYear()` .
- Added `DateTimeOffset.IsLeapYear()` .
- Added `Endianness` enum.
- Added `FileInfo.GetHash<T>()` .
- Added `FileInfo.TryWriteHash<T>(Span<byte>, out int)` .
- Added `IComparable<T>.Clamp(T, T)` - this supersedes `Clamp` defined for hard-coded numeric types. (#24)
- Added `IComparable<T1>.GreaterThan(T2)` . (#22)
- Added `IComparable<T1>.GreaterThanOrEqualTo(T2)` . (#22)
- Added `IComparable<T1>.LessThan(T2)` . (#22)
- Added `IComparable<T1>.LessThanOrEqualTo(T2)` . (#22)
- Added `IComparable<T1>.Max(T)` . (#23)
- Added `IComparable<T1>.Min(T)` . (#23)
2022-04-30 12:52:34 +00:00
- Added `IDictionary<TKey, TValue>.AddOrUpdate()`
2023-03-23 13:38:38 +00:00
- Added `IEnumerable<TSource>.Product()` and `IEnumerable<TSource>.Product<TResult>(Func<TSource>, TResult)` for all built-in
2023-03-23 13:53:12 +00:00
numeric types, computing the product of all (optionally transformed) elements.
- Added `IList<T>.Fill(T)` and `IList<T>.Fill(T, int, int)` .
- Added `IPAddress.IsIPv4()` and `IPAddress.IsIPv6()` .
- Added `IReadOnlyList<byte>.Pack8Bit()` .
- Added `IReadOnlyList<byte>.Pack16Bit()` .
- Added `IReadOnlyList<byte>.Pack32Bit()` .
- Added `IReadOnlyList<byte>.Pack64Bit()` .
- Added `MemberInfo.HasCustomAttribute<T>()` and `MemberInfo.HasCustomAttribute(Type)` .
- Added `defaultValue` overload for `MemberInfo.SelectFromCustomAttribute<TAttr, TReturn>()` .
- Added `Random.Next<T>()` (returns a random field from a specified enum type).
- Added `Random.NextByte([byte[, byte]])` .
- Added `Random.NextColorArgb()` , returning a random color in RGB space, including random alpha.
- Added `Random.NextColorRgb()` , returning a random color in RGB space with alpha 255.
- Added `Random.NextDouble(double[, double])` .
- Added `Random.NextInt16([short[, short]])` .
- Added `Random.NextSingle(float[, float])` . (#34)
- Added `Random.NextUnitVector2()` .
- Added `Random.NextUnitVector3()` .
- Added `Random.NextRotation()` .
- Added `Rune.Repeat(int)` .
- Added `byte.IsEven()` .
- Added `byte.IsOdd()` .
- Added `byte.IsPrime()` .
- Added `byte.UnpackBits()` .
- Added `byte.RangeTo(byte)` , `byte.RangeTo(short)` , `byte.RangeTo(int)` , and `byte.RangeTo(long)` .
- Added `int.Mod(int)` .
- Added `int.RangeTo(int)` , and `int.RangeTo(long)` .
- Added `int.UnpackBits()` .
- Added `long.Mod(long)` .
- Added `long.RangeTo(long)` .
- Added `long.UnpackBits()` .
- Added `sbyte.IsEven()` .
- Added `sbyte.IsOdd()` .
- Added `sbyte.IsPrime()` .
- Added `sbyte.Mod(sbyte)` .
- Added `short.IsEven()` .
- Added `short.IsOdd()` .
- Added `short.Mod(short)` .
- Added `short.RangeTo(short)` , `short.RangeTo(int)` , and `short.RangeTo(long)` .
- Added `short.UnpackBits()` .
- Added `string.IsPalindrome()` .
- Added `Stream.GetHash<T>()` .
- Added `Stream.TryWriteHash<T>(Span<byte>, out int)` .
- Added `Stream.ReadInt16([Endian])` .
- Added `Stream.ReadInt32([Endian])` .
- Added `Stream.ReadInt64([Endian])` .
- Added `Stream.ReadUInt16([Endian])` .
- Added `Stream.ReadUInt32([Endian])` .
- Added `Stream.ReadUInt64([Endian])` .
- Added `Stream.Write(short, [Endian])` .
- Added `Stream.Write(int, [Endian])` .
- Added `Stream.Write(long, [Endian])` .
- Added `Stream.Write(ushort, [Endian])` .
- Added `Stream.Write(uint, [Endian])` .
- Added `Stream.Write(ulong, [Endian])` .
- Added `TimeSpan.Ago()` .
- Added `TimeSpan.FromNow()` .
- Added `TimeSpanParser.TryParse` which supersedes `TimeSpanParser.Parse` .
- Added `Sqrt()` and `ComplexSqrt()` for all built-in decimal types.
- Added `All()` and `Any()` for `Span<T>` and `ReadOnlySpan<T>` , mimicking the corresponding methods in `System.Linq` .
- Added `Sign()` for built-in numeric types. For unsigned types, this never returns -1.
- Added `Type.Implements<T>()` and `Type.Implements(Type)` . (#25)
- Added `Type.Inherits<T>()` and `Type.Inherits(Type)` . (#25)
- Added `DigitalRoot` function for built-in integer types.
- Added `Factorial` function for built-in integer types.
- Added `HostToNetworkOrder` and `NetworkToHostOrder` for `short` , `int` , and `long` .
- Added `IsLeapYear` function for `DateTime` and `DateTimeOffset` , as well as built-in numeric types.
- Added `MultiplicativePersistence` function for built-in integer types.
- Added `RotateLeft` and `RotateRight` for built-in integer types.
2023-03-23 13:38:38 +00:00
- Added trigonometric functions for built-in numeric types,
including `Acos()` , `Asin()` , `Atan()` , `Atan2()` , `Cos()` , `Sin()` , `Tan()` (#49)
- Added time-related extension methods for built-in numeric types,
including `Milliseconds()` , `Seconds()` , `Minutes()` , `Hours()` , `Days()` , and `Weeks()` . `Ticks()` is also available, but only
2023-03-23 13:53:12 +00:00
for integers; not floating point.
2023-03-23 13:38:38 +00:00
- Added `StringBuilderReader` (inheriting `TextReader` ) which allows reading from a `StringBuilder` without consuming the
2023-03-23 13:53:12 +00:00
underlying string.
- Added extension methods for `System.Decimal` .
2022-04-21 21:06:44 +00:00
### Changed
2023-03-23 13:38:38 +00:00
2023-03-23 13:53:12 +00:00
- Updated to .NET 6. (#45)
- Methods defined to accept `byte[]` have been changed accept `IReadOnlyList<byte>` .
- Extension methods are now defined in appropriate child namespaces to reduce the risk of name collisions. (#7)
2023-03-23 13:38:38 +00:00
- `char[].Random(int)` , `char[].Random(int, int)` , `IEnumerable<char>.Random(int)` , and `IEnumerable<char>.Random(int, int)` have
2023-03-23 13:53:12 +00:00
been redefined as `Random.NextString(IReadOnlyList<char>, int)` .
2023-03-23 13:38:38 +00:00
- `IComparable<T>.Between(T, T)` has been redefined as `IComparable<T1>.Between(T2, T3, [InclusiveOptions])` to allow comparison
2023-03-23 13:53:12 +00:00
of disparate yet comparable types, and also offers inclusivity options.
- `DateTime` extensions now wrap `DateTimeOffset` extensions.
- `DateTime.ToUnixTimestamp([bool])` has been redefined as `DateTime.ToUnixTimeMilliseconds()` and `DateTime.ToUnixTimeSeconds()` .
2023-03-23 13:38:38 +00:00
- `Dictionary<T1, T2>.ToGetParameters()` , `IDictionary<T1, T2>.ToGetParameters()` ,
2023-03-23 13:53:12 +00:00
and `IReadOnlyDictionary<T1, T2>.ToGetParameters()` , has been redefined as `IEnumerable<KeyValuePair<T1, T2>>.ToGetParameters()` .
2023-03-23 13:38:38 +00:00
- `Dictionary<T1, T2>.ToConnectionString()` , `IDictionary<T1, T2>.ToConnectionString()` ,
and `IReadOnlyDictionary<T1, T2>.ToConnectionString()` , has been redefined
2023-03-23 13:53:12 +00:00
as `IEnumerable<KeyValuePair<T1, T2>>.ToConnectionString()` .
2023-03-23 13:38:38 +00:00
- `IList<T>.OneOf([Random])` and `IEnumerable<T>.OneOf([Random])` have been redefined as `Random.NextFrom<T>(IEnumerable<T>)` to
2023-03-23 13:53:12 +00:00
fall in line with the naming convention of `System.Random` . (#21)
- `IList<T>.Shuffle([Random])` now uses a Fisher-Yates shuffle implementation.
- `IList<T>.Shuffle([Random])` has been repurposed to shuffle the list in place, rather than returning a new enumerable.
2023-03-23 13:38:38 +00:00
- `IEnumerable<T>.Shuffle([Random])` has been renamed to `IEnumerable<T>.Shuffled([Random])` to avoid confusion
2023-03-23 13:53:12 +00:00
with `IList<T>.Shuffle([Random])` .
- `Random.CoinToss()` has been redefined as `Random.NextBoolean()` to fall in line with the naming convention of `System.Random` .
2023-03-23 13:38:38 +00:00
- `Random.OneOf<T>(T[])` and `Random.OneOf<T>(IList<T>)` have been redefined as `Random.NextFrom<T>(IEnumerable<T>)` to fall in
2023-03-23 13:53:12 +00:00
line with the naming convention of `System.Random` .
- `Enum.Next([bool])` and `Enum.Previous([bool])` have been redefined.
2023-03-23 13:38:38 +00:00
as `Enum.Next()` , `Enum.Previous()` , `Enum.NextUnchecked()` , `Enum.PreviousUnchecked()` . The `Unchecked` variants of these
methods do not perform index validation, and will throw `IndexOutOfRangeException` when attempting to access an invalid index.
2023-03-23 13:53:12 +00:00
The checked variants will perform a modulo to wrap the index.
2023-03-23 13:38:38 +00:00
- Seperated `string.WithAlternative(string, [bool])` to `string.WithEmptyAlternative(string)`
2023-03-23 13:53:12 +00:00
and `string.WithWhiteSpaceAlternative(string)` .
- `string.AsNullIfEmpty()` and `string.AsNullIfWhiteSpace()` now accept a nullable `string` .
2022-04-21 21:06:44 +00:00
- `IEnumerable<byte>.GetString([Encoding])` has been renamed to `IReadOnlyList<byte>.ToString` and its `Encoding` parameter has
2023-03-23 13:53:12 +00:00
been made non-optional.
2022-04-30 12:52:34 +00:00
- Fixed a bug where `IEnumerable<KeyValuePair<K,V>>.ToConnectionString()` would not sanitize types with custom `ToString()`
2023-03-23 13:53:12 +00:00
implementation. (#20)
Renamed `string.Random(int[, Random])` to `string.Randomize(int[, Random])` .
2023-03-23 13:38:38 +00:00
- Redefined `char[].Random(int)` , `char[].Random(int, Random)` , `IEnumerable<char>.Random(int)` ,
2023-03-23 13:53:12 +00:00
and `IEnumerable<char>.Random(int, Random)` , as `Random.NextString(IReadOnlyList<char>, int)` .
2022-04-30 12:52:34 +00:00
- Improved performance for:
- `string.IsLower()`
- `string.IsUpper()`
- `string.Reverse()`
- `TimeSpanParser`
2022-04-21 21:06:44 +00:00
### Removed
2023-03-23 13:38:38 +00:00
- Indefinitely suspended Unity support, until such a time that Unity can be updated to a newer version of .NET.
See: https://forum.unity.com/threads/unity-future-net-development-status.1092205/
2023-03-23 13:53:12 +00:00
- Removed `bool.And(bool)` .
- Removed `bool.NAnd(bool)` .
- Removed `bool.NOr(bool)` .
- Removed `bool.Not(bool)` .
- Removed `bool.Or(bool)` .
- Removed `bool.ToByte()` .
- Removed `bool.ToInt16()` .
- Removed `bool.ToInt64()` .
- Removed `bool.XNOr()` .
- Removed `bool.XOr()` .
- Removed `IConvertible.To<T>([IFormatProvider])` . (#13)
- Removed `IConvertible.ToOrDefault<T>([IFormatProvider])` . (#13)
- Removed `IConvertible.ToOrDefault<T>(out T, [IFormatProvider])` . (#13)
- Removed `IConvertible.ToOrNull<T>([IFormatProvider])` . (#13)
- Removed `IConvertible.ToOrNull<T>(out T, [IFormatProvider])` . (#13)
- Removed `IConvertible.ToOrOther<T>(T, [IFormatProvider])` . (#13)
- Removed `IConvertible.ToOrOther<T>(out T, T, [IFormatProvider])` . (#13)
2023-03-23 13:38:38 +00:00
- Removed `IEnumerable<T>.Split(int)` - this functionality is now provided by .NET in the form of the `Chunk` method.
2023-03-23 13:53:12 +00:00
See: https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.chunk?view=net-6.0.
- Removed `MemberInfo.GetDefaultValue()` (use `SelectFromCustomAttribute()` instead).
- Removed `MemberInfo.GetDescription()` (use `SelectFromCustomAttribute()` instead).
- Removed `int.ToBoolean()` .
- Removed `long.ToBoolean()` .
- Removed `short.ToBoolean()` .
- Removed `uint.ToBoolean()` .
- Removed `ushort.ToBoolean()` .
- Removed `ulong.ToBoolean()` .
2023-03-23 13:38:38 +00:00
- Removed `WaitHandle.WaitOneAsync()` . For suspensions of execution during asynchronous operations, favour `TaskCompletionSource`
or `TaskCompletionSource<T>` .
See: https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.taskcompletionsource?view=net-6.0
and https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.taskcompletionsource-1?view=net-6.0
2022-04-21 21:06:44 +00:00
2021-01-14 16:10:59 +00:00
## [2.6.0] - 2020-10-20
2022-04-21 21:06:44 +00:00
2021-01-14 18:34:24 +00:00
### Added
2022-04-21 21:06:44 +00:00
2023-03-23 13:53:12 +00:00
- Add `string.AsNullIfEmpty()` .
2022-04-21 21:06:44 +00:00
- Returns the current string, or `null` if the current string is null or empty.
2023-03-23 13:53:12 +00:00
- Add `string.AsNullIfWhiteSpace()` .
2022-04-21 21:06:44 +00:00
- Returns the current string, or `null` if the current string is null, empty, or consists of only whitespace.
2023-03-23 13:53:12 +00:00
- Add `string.Reverse()` .
- Reverses the current string.
- Add `string.WithAlternative()` .
2022-04-21 21:06:44 +00:00
- Returns the current string, or an alternative value if the current string is null or empty, or optionally if the current
string consists of only whitespace.
2021-01-14 16:10:59 +00:00
### Changed
2022-04-21 21:06:44 +00:00
2021-01-14 16:10:59 +00:00
- n/a
### Removed
2022-04-21 21:06:44 +00:00
2021-01-14 16:10:59 +00:00
- n/a
## [2.5.0] - 2020-07-15
2022-04-21 21:06:44 +00:00
2021-01-14 16:10:59 +00:00
### Added
2022-04-21 21:06:44 +00:00
2023-03-23 13:53:12 +00:00
- `WaitHandle.WaitOneAsync()` .
- Wraps `WaitHandle.WaitOne` as a `Task` .
- Add support for Unity 2019.4.3f1.
- Add `GameObject.LookAt(GameObject)` .
- Rotates the Transform on the current GameObject so that it faces the Transform on another GameObject.
- Add `GameObject.LookAt(Transform)` .
- Rotates the Transform on the current GameObject so that it faces another transform.
2022-04-21 21:06:44 +00:00
- Add `Transform.LookAt(GameObject)`
2023-03-23 13:53:12 +00:00
- Rotates the current Transform so that it faces the Transform on another GameObject.
- Add `Vector3.Round([float])` .
- Returns a rounded Vector3 by calling `float.Round()` on each component.
- Add `Vector3.WithX(float)` .
- Returns a Vector3 with a new X component value.
- Add `Vector3.WithY(float)` .
- Returns a Vector3 with a new Y component value.
- Add `Vector3.WithZ(float)` .
- Returns a Vector3 with a new Z component value.
- Add `Vector3.WithXY(float, float)` .
- Returns a Vector3 with new X and Y component values.
- Add `Vector3.WithXZ(float, float)` .
- Returns a Vector3 with new X and Z component values.
- Add `Vector3.WithYZ(float, float)` .
- Returns a Vector3 with new Y and Z component values.
- Add `BetterBehavior` (experimental wrapper over `MonoBehaviour` ).
2021-01-14 16:10:59 +00:00
### Changed
2022-04-21 21:06:44 +00:00
2021-01-14 16:10:59 +00:00
- n/a
### Removed
2022-04-21 21:06:44 +00:00
2021-01-14 16:10:59 +00:00
- n/a
2020-04-21 03:23:44 +00:00
## [2.2.0] - 2020-04-21
2022-04-21 21:06:44 +00:00
2020-04-20 13:00:20 +00:00
### Added
2022-04-21 21:06:44 +00:00
2023-03-23 13:53:12 +00:00
- Add `string.ChangeEncoding(Encoding, Encoding)` .
- Converts this string from one encoding to another.
- Add `string.IsLower()` .
- Determines if all alpha characters in this string are considered lowercase.
- Add `string.IsUpper()` .
- Determines if all alpha characters in this string are considered uppercase.
2020-04-20 13:00:20 +00:00
2020-04-21 03:17:28 +00:00
- Various extension methods with regards to reflection:
2023-03-23 13:53:12 +00:00
- `GetDefaultValue` and `GetDefaultValue<T>` - gets the value stored in the member's `DefaultValue` attribute.
- `GetDescription` - gets the value stored in the member's `Description` attribute.
2022-04-21 21:06:44 +00:00
- `SelectFromCustomAttribute<T1, T2>` - Internally calls `GetCustomAttribute<T1>` and passes it to a `Func<T1, T2>` so that
2023-03-23 13:53:12 +00:00
specific members may be selected.
2020-04-21 03:17:28 +00:00
2020-04-20 13:00:20 +00:00
### Changed
2022-04-21 21:06:44 +00:00
2020-04-20 13:00:20 +00:00
- n/a
### Removed
2022-04-21 21:06:44 +00:00
2020-04-20 13:00:20 +00:00
- n/a
## [2.1.0] - 2020-04-18
2022-04-21 21:06:44 +00:00
2020-04-20 13:00:20 +00:00
### Added
2022-04-21 21:06:44 +00:00
2023-03-23 13:53:12 +00:00
- Add `bool bool.And(bool)` .
- Performs logical AND.
- Add `bool bool.Or(bool)` .
- Performs logical OR.
- Add `bool bool.Not(bool)` .
- Performs logical NOT.
- Add `bool bool.XOr(bool)` .
- Performs Logical XOR.
- Add `bool bool.NAnd(bool)` .
- Performs logical NAND.
- Add `bool bool.NOr(bool)` .
- Performs logical NOR.
- Add `bool bool.XNOr(bool)` .
- Performs logical XNOR.
- Add `byte bool.ToByte()` .
- 1 if `true` , 0 otherwise.
- Add `short bool.ToInt16()` .
- 1 if `true` , 0 otherwise.
- Add `long bool.ToInt64()` .
- 1 if `true` , 0 otherwise.
2020-04-20 13:00:20 +00:00
### Changed
2022-04-21 21:06:44 +00:00
2020-04-20 13:00:20 +00:00
- n/a
### Removed
2022-04-21 21:06:44 +00:00
2020-04-20 13:00:20 +00:00
- n/a
## [2.0.0] - 2020-04-18
### Added
2022-04-21 21:06:44 +00:00
2023-03-23 13:53:12 +00:00
- Add `IEnumerable<T>.Split(int)` .
- Performs the same operation as the previously defined `IEnumerable<byte>.Chunkify(int)` , except now accepts any type `T` .
2020-04-20 13:00:20 +00:00
### Changed
2022-04-21 21:06:44 +00:00
2023-03-23 13:53:12 +00:00
- Fix `DateTime.Last(DayOfWeek)` implementation.
- Now returns the correct date/time for a given day of the week.
2020-04-20 13:00:20 +00:00
### Removed
2022-04-21 21:06:44 +00:00
2023-03-23 13:53:12 +00:00
- Remove `IEnumerable<byte>.Chunkify(int)` .
- Replaced by a method of the same behaviour `IEnumerable<T>.Split(int)` .
2020-04-20 13:00:20 +00:00
## Earlier versions
2022-04-21 21:06:44 +00:00
2023-03-23 13:38:38 +00:00
Earlier versions of this package are undocumented and unlisted from package results.
2020-04-20 13:00:20 +00:00
2024-11-13 18:22:36 +00:00
[unreleased]: https://github.com/oliverbooth/X10D/compare/v4.0.0...main
[4.0.0]: https://github.com/oliverbooth/X10D/releases/tag/v4.0.0
2023-08-21 16:39:35 +00:00
[3.3.1]: https://github.com/oliverbooth/X10D/releases/tag/v3.3.1
2023-08-21 16:25:41 +00:00
[3.3.0]: https://github.com/oliverbooth/X10D/releases/tag/v3.3.0
2023-08-09 14:24:33 +00:00
[3.2.2]: https://github.com/oliverbooth/X10D/releases/tag/v3.2.2
2023-04-03 17:17:40 +00:00
[3.2.0]: https://github.com/oliverbooth/X10D/releases/tag/v3.2.0
2022-05-13 08:36:20 +00:00
[3.1.0]: https://github.com/oliverbooth/X10D/releases/tag/v3.1.0
2022-04-30 13:24:18 +00:00
[3.0.0]: https://github.com/oliverbooth/X10D/releases/tag/v3.0.0
2021-01-14 16:14:20 +00:00
[2.6.0]: https://github.com/oliverbooth/X10D/releases/tag/2.6.0
2021-01-14 16:10:59 +00:00
[2.5.0]: https://github.com/oliverbooth/X10D/releases/tag/2.5.0
2020-04-21 03:42:06 +00:00
[2.2.0]: https://github.com/oliverbooth/X10D/releases/tag/2.2.0
2020-04-20 13:00:20 +00:00
[2.1.0]: https://github.com/oliverbooth/X10D/releases/tag/2.1.0
[2.0.0]: https://github.com/oliverbooth/X10D/releases/tag/2.0.0