Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions Funcky.Test/Extensions/NumberExtensionsTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace Funcky.Test.Extensions;

public class NumberExtensionsTest
{
[Fact]
public void Example()
{
var position = 12;

Assert.True(position.IsBetween<Including, Excluding>(20, 0));
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Idea: InRange instead of IsBetween

}
}
13 changes: 13 additions & 0 deletions Funcky/Extensions/Excluding.cs
Original file line number Diff line number Diff line change
@@ -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);
}
6 changes: 6 additions & 0 deletions Funcky/Extensions/IIntervalBoundary.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace Funcky.Extensions;

public interface IIntervalBoundary
{
int Value { get; }
}
13 changes: 13 additions & 0 deletions Funcky/Extensions/Including.cs
Original file line number Diff line number Diff line change
@@ -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);
}
35 changes: 35 additions & 0 deletions Funcky/Extensions/NumberExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
namespace Funcky.Extensions;

public static class NumberExtensions
{
public static bool IsBetween<TFrom, TTo>(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<TFrom, TTo>(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<TFrom, TTo>(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,
};
}