From 870497ca174398c6391ccc11991a809f86eed9f3 Mon Sep 17 00:00:00 2001 From: Thomas Bruderer Date: Mon, 26 Feb 2024 10:26:53 +0100 Subject: [PATCH] Implements #752 * Implements FindIndexOrNone on List * Implements FindLastIndexOrNone on List * with tests --- Funcky.Test/Extensions/ListExtensionsTest.cs | 20 ++++++++++++++++ Funcky/Extensions/ListExtensions.cs | 24 ++++++++++++++++++++ Funcky/PublicAPI.Unshipped.txt | 6 +++++ 3 files changed, 50 insertions(+) diff --git a/Funcky.Test/Extensions/ListExtensionsTest.cs b/Funcky.Test/Extensions/ListExtensionsTest.cs index ce56a517..f31dfe15 100644 --- a/Funcky.Test/Extensions/ListExtensionsTest.cs +++ b/Funcky.Test/Extensions/ListExtensionsTest.cs @@ -18,4 +18,24 @@ public void GivenAListIndexOfOrNoneReturnsSomeIndexIfTheElementIsInTheList() FunctionalAssert.Some(2, list.IndexOfOrNone("Epsilon")); } + + [Fact] + public void GivenAListAndAPredicateFindIndexOrNoneReturnsTheFirstElementMatchingThePredicateInTheGivenInterval() + { + List 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 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"))); + } } diff --git a/Funcky/Extensions/ListExtensions.cs b/Funcky/Extensions/ListExtensions.cs index 9c7711c3..01a67ef5 100644 --- a/Funcky/Extensions/ListExtensions.cs +++ b/Funcky/Extensions/ListExtensions.cs @@ -7,4 +7,28 @@ public static class ListExtensions [Pure] public static Option IndexOfOrNone(this IList list, TValue value) => MapNotFoundToNone(list.IndexOf(value)); + + [Pure] + public static Option FindIndexOrNone(this List list, Predicate match) + => MapNotFoundToNone(list.FindIndex(match)); + + [Pure] + public static Option FindIndexOrNone(this List list, int startIndex, Predicate match) + => MapNotFoundToNone(list.FindIndex(startIndex, match)); + + [Pure] + public static Option FindIndexOrNone(this List list, int startIndex, int count, Predicate match) + => MapNotFoundToNone(list.FindIndex(startIndex, count, match)); + + [Pure] + public static Option FindLastIndexOrNone(this List list, Predicate match) + => MapNotFoundToNone(list.FindLastIndex(match)); + + [Pure] + public static Option FindLastIndexOrNone(this List list, int startIndex, Predicate match) + => MapNotFoundToNone(list.FindLastIndex(startIndex, match)); + + [Pure] + public static Option FindLastIndexOrNone(this List list, int startIndex, int count, Predicate match) + => MapNotFoundToNone(list.FindLastIndex(startIndex, count, match)); } diff --git a/Funcky/PublicAPI.Unshipped.txt b/Funcky/PublicAPI.Unshipped.txt index 8e1c4602..596cbdff 100644 --- a/Funcky/PublicAPI.Unshipped.txt +++ b/Funcky/PublicAPI.Unshipped.txt @@ -12,6 +12,12 @@ Funcky.Monads.Result.OrElse(System.Func static Funcky.Extensions.EnumerableExtensions.InspectEmpty(this System.Collections.Generic.IEnumerable! source, System.Action! inspector) -> System.Collections.Generic.IEnumerable! static Funcky.Extensions.EnumeratorExtensions.MoveNextOrNone(this System.Collections.Generic.IEnumerator! enumerator) -> Funcky.Monads.Option +static Funcky.Extensions.ListExtensions.FindIndexOrNone(this System.Collections.Generic.List! list, int startIndex, int count, System.Predicate! match) -> Funcky.Monads.Option +static Funcky.Extensions.ListExtensions.FindIndexOrNone(this System.Collections.Generic.List! list, int startIndex, System.Predicate! match) -> Funcky.Monads.Option +static Funcky.Extensions.ListExtensions.FindIndexOrNone(this System.Collections.Generic.List! list, System.Predicate! match) -> Funcky.Monads.Option +static Funcky.Extensions.ListExtensions.FindLastIndexOrNone(this System.Collections.Generic.List! list, int startIndex, int count, System.Predicate! match) -> Funcky.Monads.Option +static Funcky.Extensions.ListExtensions.FindLastIndexOrNone(this System.Collections.Generic.List! list, int startIndex, System.Predicate! match) -> Funcky.Monads.Option +static Funcky.Extensions.ListExtensions.FindLastIndexOrNone(this System.Collections.Generic.List! list, System.Predicate! match) -> Funcky.Monads.Option static Funcky.Extensions.ParseExtensions.ParseByteOrNone(this System.ReadOnlySpan candidate, System.Globalization.NumberStyles style, System.IFormatProvider? provider) -> Funcky.Monads.Option static Funcky.Extensions.ParseExtensions.ParseByteOrNone(this System.ReadOnlySpan candidate, System.IFormatProvider? provider) -> Funcky.Monads.Option static Funcky.Extensions.ParseExtensions.ParseByteOrNone(this System.ReadOnlySpan candidate) -> Funcky.Monads.Option