Skip to content

Commit

Permalink
Merge pull request #781 from polyadic/implement-list-extensions
Browse files Browse the repository at this point in the history
Implements FindIndexOrNone and FindLastIndexOrNone on List
  • Loading branch information
FreeApophis authored Feb 27, 2024
2 parents f1c3169 + 870497c commit 6bfe87a
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 0 deletions.
20 changes: 20 additions & 0 deletions Funcky.Test/Extensions/ListExtensionsTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,24 @@ public void GivenAListIndexOfOrNoneReturnsSomeIndexIfTheElementIsInTheList()

FunctionalAssert.Some(2, list.IndexOfOrNone("Epsilon"));
}

[Fact]
public void GivenAListAndAPredicateFindIndexOrNoneReturnsTheFirstElementMatchingThePredicateInTheGivenInterval()
{
List<string> list = ["Alpha", "Gamma", "Alien", "Epsilon"];

FunctionalAssert.Some(0, list.FindIndexOrNone(item => item.StartsWith("Al")));
FunctionalAssert.Some(2, list.FindIndexOrNone(2, item => item.StartsWith("Al")));
FunctionalAssert.None(list.FindIndexOrNone(3, 1, item => item.StartsWith("Al")));
}

[Fact]
public void GivenAListAndAPredicateFindLastIndexOrNoneReturnsTheLastElementMatchingThePredicateInTheGivenInterval()
{
List<string> list = ["Alpha", "Gamma", "Alien", "Epsilon"];

FunctionalAssert.Some(2, list.FindLastIndexOrNone(item => item.StartsWith("Al")));
FunctionalAssert.Some(0, list.FindLastIndexOrNone(1, item => item.StartsWith("Al")));
FunctionalAssert.None(list.FindLastIndexOrNone(3, 1, item => item.StartsWith("Al")));
}
}
24 changes: 24 additions & 0 deletions Funcky/Extensions/ListExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,28 @@ public static class ListExtensions
[Pure]
public static Option<int> IndexOfOrNone<TValue>(this IList<TValue> list, TValue value)
=> MapNotFoundToNone(list.IndexOf(value));

[Pure]
public static Option<int> FindIndexOrNone<TValue>(this List<TValue> list, Predicate<TValue> match)
=> MapNotFoundToNone(list.FindIndex(match));

[Pure]
public static Option<int> FindIndexOrNone<TValue>(this List<TValue> list, int startIndex, Predicate<TValue> match)
=> MapNotFoundToNone(list.FindIndex(startIndex, match));

[Pure]
public static Option<int> FindIndexOrNone<TValue>(this List<TValue> list, int startIndex, int count, Predicate<TValue> match)
=> MapNotFoundToNone(list.FindIndex(startIndex, count, match));

[Pure]
public static Option<int> FindLastIndexOrNone<TValue>(this List<TValue> list, Predicate<TValue> match)
=> MapNotFoundToNone(list.FindLastIndex(match));

[Pure]
public static Option<int> FindLastIndexOrNone<TValue>(this List<TValue> list, int startIndex, Predicate<TValue> match)
=> MapNotFoundToNone(list.FindLastIndex(startIndex, match));

[Pure]
public static Option<int> FindLastIndexOrNone<TValue>(this List<TValue> list, int startIndex, int count, Predicate<TValue> match)
=> MapNotFoundToNone(list.FindLastIndex(startIndex, count, match));
}
6 changes: 6 additions & 0 deletions Funcky/PublicAPI.Unshipped.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@ Funcky.Monads.Result<TValidResult>.OrElse(System.Func<System.Exception!, Funcky.
Funcky.UpCast<TResult>
static Funcky.Extensions.EnumerableExtensions.InspectEmpty<TSource>(this System.Collections.Generic.IEnumerable<TSource>! source, System.Action! inspector) -> System.Collections.Generic.IEnumerable<TSource>!
static Funcky.Extensions.EnumeratorExtensions.MoveNextOrNone<T>(this System.Collections.Generic.IEnumerator<T>! enumerator) -> Funcky.Monads.Option<T>
static Funcky.Extensions.ListExtensions.FindIndexOrNone<TValue>(this System.Collections.Generic.List<TValue>! list, int startIndex, int count, System.Predicate<TValue>! match) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ListExtensions.FindIndexOrNone<TValue>(this System.Collections.Generic.List<TValue>! list, int startIndex, System.Predicate<TValue>! match) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ListExtensions.FindIndexOrNone<TValue>(this System.Collections.Generic.List<TValue>! list, System.Predicate<TValue>! match) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ListExtensions.FindLastIndexOrNone<TValue>(this System.Collections.Generic.List<TValue>! list, int startIndex, int count, System.Predicate<TValue>! match) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ListExtensions.FindLastIndexOrNone<TValue>(this System.Collections.Generic.List<TValue>! list, int startIndex, System.Predicate<TValue>! match) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ListExtensions.FindLastIndexOrNone<TValue>(this System.Collections.Generic.List<TValue>! list, System.Predicate<TValue>! match) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ParseExtensions.ParseByteOrNone(this System.ReadOnlySpan<byte> candidate, System.Globalization.NumberStyles style, System.IFormatProvider? provider) -> Funcky.Monads.Option<byte>
static Funcky.Extensions.ParseExtensions.ParseByteOrNone(this System.ReadOnlySpan<byte> candidate, System.IFormatProvider? provider) -> Funcky.Monads.Option<byte>
static Funcky.Extensions.ParseExtensions.ParseByteOrNone(this System.ReadOnlySpan<byte> candidate) -> Funcky.Monads.Option<byte>
Expand Down

0 comments on commit 6bfe87a

Please sign in to comment.