diff --git a/Funcky.Test/Extensions/NumberExtensionsTest.cs b/Funcky.Test/Extensions/NumberExtensionsTest.cs new file mode 100644 index 00000000..f9020fb7 --- /dev/null +++ b/Funcky.Test/Extensions/NumberExtensionsTest.cs @@ -0,0 +1,12 @@ +namespace Funcky.Test.Extensions; + +public class NumberExtensionsTest +{ + [Fact] + public void Example() + { + var position = 12; + + Assert.True(position.IsBetween(20, 0)); + } +} diff --git a/Funcky/Extensions/Excluding.cs b/Funcky/Extensions/Excluding.cs new file mode 100644 index 00000000..d0d93565 --- /dev/null +++ b/Funcky/Extensions/Excluding.cs @@ -0,0 +1,13 @@ +namespace Funcky.Extensions; + +public class Excluding : IIntervalBoundary +{ + private Excluding(int number) + { + Value = number; + } + + public int Value { get; } + + public static implicit operator Excluding(int number) => new(number); +} diff --git a/Funcky/Extensions/IIntervalBoundary.cs b/Funcky/Extensions/IIntervalBoundary.cs new file mode 100644 index 00000000..991f4487 --- /dev/null +++ b/Funcky/Extensions/IIntervalBoundary.cs @@ -0,0 +1,6 @@ +namespace Funcky.Extensions; + +public interface IIntervalBoundary +{ + int Value { get; } +} diff --git a/Funcky/Extensions/Including.cs b/Funcky/Extensions/Including.cs new file mode 100644 index 00000000..597c52b7 --- /dev/null +++ b/Funcky/Extensions/Including.cs @@ -0,0 +1,13 @@ +namespace Funcky.Extensions; + +public class Including : IIntervalBoundary +{ + private Including(int number) + { + Value = number; + } + + public int Value { get; } + + public static implicit operator Including(int number) => new(number); +} diff --git a/Funcky/Extensions/NumberExtensions.cs b/Funcky/Extensions/NumberExtensions.cs new file mode 100644 index 00000000..87fc935d --- /dev/null +++ b/Funcky/Extensions/NumberExtensions.cs @@ -0,0 +1,35 @@ +namespace Funcky.Extensions; + +public static class NumberExtensions +{ + public static bool IsBetween(this int number, TFrom from, TTo to) + where TFrom : IIntervalBoundary + where TTo : IIntervalBoundary + => from.Value < to.Value + ? IsBetweenForward(number, from, to) + : IsBetweenBackward(number, from, to); + + private static bool IsBetweenForward(int number, TFrom from, TTo to) + where TFrom : IIntervalBoundary + where TTo : IIntervalBoundary + => (from, to) switch + { + (Including, Including) => from.Value <= number && number <= to.Value, + (Including, Excluding) => from.Value <= number && number < to.Value, + (Excluding, Including) => from.Value < number && number <= to.Value, + (Excluding, Excluding) => from.Value < number && number < to.Value, + _ => false, + }; + + private static bool IsBetweenBackward(int number, TFrom from, TTo to) + where TFrom : IIntervalBoundary + where TTo : IIntervalBoundary + => (from, to) switch + { + (Including, Including) => from.Value >= number && number >= to.Value, + (Including, Excluding) => from.Value >= number && number > to.Value, + (Excluding, Including) => from.Value > number && number >= to.Value, + (Excluding, Excluding) => from.Value > number && number > to.Value, + _ => false, + }; +}