diff --git a/Funcky.Test/Extensions/ImmutableListExtensions/IndexOfOrNoneTest.cs b/Funcky.Test/Extensions/ImmutableListExtensions/IndexOfOrNoneTest.cs index 28bc09d7..f9575a41 100644 --- a/Funcky.Test/Extensions/ImmutableListExtensions/IndexOfOrNoneTest.cs +++ b/Funcky.Test/Extensions/ImmutableListExtensions/IndexOfOrNoneTest.cs @@ -55,4 +55,11 @@ public void GivenZeroIndexIndexOfOrNoneReturnsNone() FunctionalAssert.None(list.IndexOfOrNone("Gamma", 0)); FunctionalAssert.None(list.IndexOfOrNone("Gamma", 0, 0)); } + + [Fact] + public void CallIsNotAmbiguousWhenUsedOnConcreteTypes() + { + _ = ImmutableArray.Empty.IndexOfOrNone("foo"); + _ = ImmutableList.Empty.IndexOfOrNone("foo"); + } } diff --git a/Funcky/Extensions/ImmutableListExtensions/IndexOfOrNone.cs b/Funcky/Extensions/ListExtensions/IImmutableList.IndexOfOrNone.cs similarity index 98% rename from Funcky/Extensions/ImmutableListExtensions/IndexOfOrNone.cs rename to Funcky/Extensions/ListExtensions/IImmutableList.IndexOfOrNone.cs index d8194360..d3b326f0 100644 --- a/Funcky/Extensions/ImmutableListExtensions/IndexOfOrNone.cs +++ b/Funcky/Extensions/ListExtensions/IImmutableList.IndexOfOrNone.cs @@ -1,9 +1,10 @@ using System.Collections.Immutable; +using System.Runtime.CompilerServices; using static Funcky.Internal.ValueMapper; namespace Funcky.Extensions; -public static partial class ImmutableListExtensions +public static partial class ListExtensions { /// /// Searches for the specified object and returns the zero-based index of the first occurrence within the range of elements in the that starts at the specified index and contains the specified number of elements. @@ -25,6 +26,7 @@ public static Option IndexOfOrNone(this IImmutableList list, /// An of values. /// The object to locate in the . This value can be null for reference types. /// The zero-based index of the first occurrence of within the range of elements in the if found; otherwise . + [OverloadResolutionPriority(1)] public static Option IndexOfOrNone(this IImmutableList list, TItem item) => MapNotFoundToNone(list.IndexOf(item)); diff --git a/Funcky/Extensions/ImmutableListExtensions/LastIndexOfOrNone.cs b/Funcky/Extensions/ListExtensions/IImmutableList.LastIndexOfOrNone.cs similarity index 99% rename from Funcky/Extensions/ImmutableListExtensions/LastIndexOfOrNone.cs rename to Funcky/Extensions/ListExtensions/IImmutableList.LastIndexOfOrNone.cs index 044b31f8..b4c4c9d3 100644 --- a/Funcky/Extensions/ImmutableListExtensions/LastIndexOfOrNone.cs +++ b/Funcky/Extensions/ListExtensions/IImmutableList.LastIndexOfOrNone.cs @@ -3,7 +3,7 @@ namespace Funcky.Extensions; -public static partial class ImmutableListExtensions +public static partial class ListExtensions { /// /// Searches for the specified object and returns the zero-based index of the last occurrence within the range of elements in the that contains the specified number of elements and ends at the specified index. diff --git a/Funcky/Extensions/ListExtensions/IList.cs b/Funcky/Extensions/ListExtensions/IList.cs new file mode 100644 index 00000000..90cafe42 --- /dev/null +++ b/Funcky/Extensions/ListExtensions/IList.cs @@ -0,0 +1,10 @@ +using static Funcky.Internal.ValueMapper; + +namespace Funcky.Extensions; + +public static partial class ListExtensions +{ + [Pure] + public static Option IndexOfOrNone(this IList list, TValue value) + => MapNotFoundToNone(list.IndexOf(value)); +} diff --git a/Funcky/Extensions/ListExtensions.cs b/Funcky/Extensions/ListExtensions/List.cs similarity index 86% rename from Funcky/Extensions/ListExtensions.cs rename to Funcky/Extensions/ListExtensions/List.cs index 01a67ef5..ed80b0bd 100644 --- a/Funcky/Extensions/ListExtensions.cs +++ b/Funcky/Extensions/ListExtensions/List.cs @@ -2,12 +2,8 @@ namespace Funcky.Extensions; -public static class ListExtensions +public static partial 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)); diff --git a/Funcky/Obsolete/ImmutableListExtensions/IndexOfOrNone.cs b/Funcky/Obsolete/ImmutableListExtensions/IndexOfOrNone.cs new file mode 100644 index 00000000..ac4cf56a --- /dev/null +++ b/Funcky/Obsolete/ImmutableListExtensions/IndexOfOrNone.cs @@ -0,0 +1,60 @@ +using System.Collections.Immutable; +using System.ComponentModel; +using static Funcky.Internal.ValueMapper; + +namespace Funcky.Extensions; + +[EditorBrowsable(EditorBrowsableState.Never)] +[Obsolete($"Use {nameof(ListExtensions)} instead.")] +public static partial class ImmutableListExtensions +{ + [EditorBrowsable(EditorBrowsableState.Never)] + [Obsolete($"Use {nameof(ListExtensions)}.{nameof(IndexOfOrNone)} instead.")] + public static Option IndexOfOrNone(IImmutableList list, TItem item, int startIndex, int count, IEqualityComparer? equalityComparer) + => MapNotFoundToNone(list.IndexOf(item, startIndex, count, equalityComparer)); + + [EditorBrowsable(EditorBrowsableState.Never)] + [Obsolete($"Use {nameof(ListExtensions)}.{nameof(IndexOfOrNone)} instead.")] + public static Option IndexOfOrNone(IImmutableList list, TItem item) + => MapNotFoundToNone(list.IndexOf(item)); + + [EditorBrowsable(EditorBrowsableState.Never)] + [Obsolete($"Use {nameof(ListExtensions)}.{nameof(IndexOfOrNone)} instead.")] + public static Option IndexOfOrNone(IImmutableList list, TItem item, IEqualityComparer? equalityComparer) + => MapNotFoundToNone(list.IndexOf(item, equalityComparer)); + + [EditorBrowsable(EditorBrowsableState.Never)] + [Obsolete($"Use {nameof(ListExtensions)}.{nameof(IndexOfOrNone)} instead.")] + public static Option IndexOfOrNone(IImmutableList list, TItem item, int startIndex) + => MapNotFoundToNone(list.IndexOf(item, startIndex)); + + [EditorBrowsable(EditorBrowsableState.Never)] + [Obsolete($"Use {nameof(ListExtensions)}.{nameof(IndexOfOrNone)} instead.")] + public static Option IndexOfOrNone(IImmutableList list, TItem item, int startIndex, int count) + => MapNotFoundToNone(list.IndexOf(item, startIndex, count)); + + [EditorBrowsable(EditorBrowsableState.Never)] + [Obsolete($"Use {nameof(ListExtensions)}.{nameof(LastIndexOfOrNone)} instead.")] + public static Option LastIndexOfOrNone(IImmutableList list, TItem item, int startIndex, int count, IEqualityComparer? equalityComparer) + => MapNotFoundToNone(list.LastIndexOf(item, startIndex, count, equalityComparer)); + + [EditorBrowsable(EditorBrowsableState.Never)] + [Obsolete($"Use {nameof(ListExtensions)}.{nameof(LastIndexOfOrNone)} instead.")] + public static Option LastIndexOfOrNone(IImmutableList list, TItem item) + => MapNotFoundToNone(list.LastIndexOf(item)); + + [EditorBrowsable(EditorBrowsableState.Never)] + [Obsolete($"Use {nameof(ListExtensions)}.{nameof(LastIndexOfOrNone)} instead.")] + public static Option LastIndexOfOrNone(IImmutableList list, TItem item, IEqualityComparer? equalityComparer) + => MapNotFoundToNone(list.LastIndexOf(item, equalityComparer)); + + [EditorBrowsable(EditorBrowsableState.Never)] + [Obsolete($"Use {nameof(ListExtensions)}.{nameof(LastIndexOfOrNone)} instead.")] + public static Option LastIndexOfOrNone(IImmutableList list, TItem item, int startIndex) + => MapNotFoundToNone(list.LastIndexOf(item, startIndex)); + + [EditorBrowsable(EditorBrowsableState.Never)] + [Obsolete($"Use {nameof(ListExtensions)}.{nameof(LastIndexOfOrNone)} instead.")] + public static Option LastIndexOfOrNone(IImmutableList list, TItem item, int startIndex, int count) + => MapNotFoundToNone(list.LastIndexOf(item, startIndex, count)); +} diff --git a/Funcky/PublicAPI.Shipped.txt b/Funcky/PublicAPI.Shipped.txt index 6200312d..2650399f 100644 --- a/Funcky/PublicAPI.Shipped.txt +++ b/Funcky/PublicAPI.Shipped.txt @@ -363,16 +363,16 @@ static Funcky.Extensions.FuncExtensions.Uncurry(this System static Funcky.Extensions.FuncExtensions.Uncurry(this System.Func!>! function) -> System.Func! static Funcky.Extensions.HttpHeadersExtensions.GetValuesOrNone(this System.Net.Http.Headers.HttpHeaders! headers, string! name) -> Funcky.Monads.Option!> static Funcky.Extensions.HttpHeadersNonValidatedExtensions.GetValuesOrNone(this System.Net.Http.Headers.HttpHeadersNonValidated headers, string! headerName) -> Funcky.Monads.Option -static Funcky.Extensions.ImmutableListExtensions.IndexOfOrNone(this System.Collections.Immutable.IImmutableList! list, TItem item) -> Funcky.Monads.Option -static Funcky.Extensions.ImmutableListExtensions.IndexOfOrNone(this System.Collections.Immutable.IImmutableList! list, TItem item, int startIndex) -> Funcky.Monads.Option -static Funcky.Extensions.ImmutableListExtensions.IndexOfOrNone(this System.Collections.Immutable.IImmutableList! list, TItem item, int startIndex, int count) -> Funcky.Monads.Option -static Funcky.Extensions.ImmutableListExtensions.IndexOfOrNone(this System.Collections.Immutable.IImmutableList! list, TItem item, int startIndex, int count, System.Collections.Generic.IEqualityComparer? equalityComparer) -> Funcky.Monads.Option -static Funcky.Extensions.ImmutableListExtensions.IndexOfOrNone(this System.Collections.Immutable.IImmutableList! list, TItem item, System.Collections.Generic.IEqualityComparer? equalityComparer) -> Funcky.Monads.Option -static Funcky.Extensions.ImmutableListExtensions.LastIndexOfOrNone(this System.Collections.Immutable.IImmutableList! list, TItem item) -> Funcky.Monads.Option -static Funcky.Extensions.ImmutableListExtensions.LastIndexOfOrNone(this System.Collections.Immutable.IImmutableList! list, TItem item, int startIndex) -> Funcky.Monads.Option -static Funcky.Extensions.ImmutableListExtensions.LastIndexOfOrNone(this System.Collections.Immutable.IImmutableList! list, TItem item, int startIndex, int count) -> Funcky.Monads.Option -static Funcky.Extensions.ImmutableListExtensions.LastIndexOfOrNone(this System.Collections.Immutable.IImmutableList! list, TItem item, int startIndex, int count, System.Collections.Generic.IEqualityComparer? equalityComparer) -> Funcky.Monads.Option -static Funcky.Extensions.ImmutableListExtensions.LastIndexOfOrNone(this System.Collections.Immutable.IImmutableList! list, TItem item, System.Collections.Generic.IEqualityComparer? equalityComparer) -> Funcky.Monads.Option +static Funcky.Extensions.ImmutableListExtensions.IndexOfOrNone(System.Collections.Immutable.IImmutableList! list, TItem item) -> Funcky.Monads.Option +static Funcky.Extensions.ImmutableListExtensions.IndexOfOrNone(System.Collections.Immutable.IImmutableList! list, TItem item, int startIndex) -> Funcky.Monads.Option +static Funcky.Extensions.ImmutableListExtensions.IndexOfOrNone(System.Collections.Immutable.IImmutableList! list, TItem item, int startIndex, int count) -> Funcky.Monads.Option +static Funcky.Extensions.ImmutableListExtensions.IndexOfOrNone(System.Collections.Immutable.IImmutableList! list, TItem item, int startIndex, int count, System.Collections.Generic.IEqualityComparer? equalityComparer) -> Funcky.Monads.Option +static Funcky.Extensions.ImmutableListExtensions.IndexOfOrNone(System.Collections.Immutable.IImmutableList! list, TItem item, System.Collections.Generic.IEqualityComparer? equalityComparer) -> Funcky.Monads.Option +static Funcky.Extensions.ImmutableListExtensions.LastIndexOfOrNone(System.Collections.Immutable.IImmutableList! list, TItem item) -> Funcky.Monads.Option +static Funcky.Extensions.ImmutableListExtensions.LastIndexOfOrNone(System.Collections.Immutable.IImmutableList! list, TItem item, int startIndex) -> Funcky.Monads.Option +static Funcky.Extensions.ImmutableListExtensions.LastIndexOfOrNone(System.Collections.Immutable.IImmutableList! list, TItem item, int startIndex, int count) -> Funcky.Monads.Option +static Funcky.Extensions.ImmutableListExtensions.LastIndexOfOrNone(System.Collections.Immutable.IImmutableList! list, TItem item, int startIndex, int count, System.Collections.Generic.IEqualityComparer? equalityComparer) -> Funcky.Monads.Option +static Funcky.Extensions.ImmutableListExtensions.LastIndexOfOrNone(System.Collections.Immutable.IImmutableList! list, TItem item, System.Collections.Generic.IEqualityComparer? equalityComparer) -> 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 diff --git a/Funcky/PublicAPI.Unshipped.txt b/Funcky/PublicAPI.Unshipped.txt index b3855253..151a8982 100644 --- a/Funcky/PublicAPI.Unshipped.txt +++ b/Funcky/PublicAPI.Unshipped.txt @@ -58,6 +58,16 @@ static Funcky.Extensions.FuncExtensions.Apply(this System.F static Funcky.Extensions.FuncExtensions.Apply(this System.Func! func, Funcky.Unit p1, T2 p2) -> System.Func! static Funcky.Extensions.FuncExtensions.Apply(this System.Func! func, T1 p1, Funcky.Unit p2) -> System.Func! static Funcky.Extensions.JsonSerializerOptionsExtensions.GetTypeInfoOrNone(this System.Text.Json.JsonSerializerOptions! options, System.Type! type) -> Funcky.Monads.Option +static Funcky.Extensions.ListExtensions.IndexOfOrNone(this System.Collections.Immutable.IImmutableList! list, TItem item) -> Funcky.Monads.Option +static Funcky.Extensions.ListExtensions.IndexOfOrNone(this System.Collections.Immutable.IImmutableList! list, TItem item, int startIndex) -> Funcky.Monads.Option +static Funcky.Extensions.ListExtensions.IndexOfOrNone(this System.Collections.Immutable.IImmutableList! list, TItem item, int startIndex, int count) -> Funcky.Monads.Option +static Funcky.Extensions.ListExtensions.IndexOfOrNone(this System.Collections.Immutable.IImmutableList! list, TItem item, int startIndex, int count, System.Collections.Generic.IEqualityComparer? equalityComparer) -> Funcky.Monads.Option +static Funcky.Extensions.ListExtensions.IndexOfOrNone(this System.Collections.Immutable.IImmutableList! list, TItem item, System.Collections.Generic.IEqualityComparer? equalityComparer) -> Funcky.Monads.Option +static Funcky.Extensions.ListExtensions.LastIndexOfOrNone(this System.Collections.Immutable.IImmutableList! list, TItem item) -> Funcky.Monads.Option +static Funcky.Extensions.ListExtensions.LastIndexOfOrNone(this System.Collections.Immutable.IImmutableList! list, TItem item, int startIndex) -> Funcky.Monads.Option +static Funcky.Extensions.ListExtensions.LastIndexOfOrNone(this System.Collections.Immutable.IImmutableList! list, TItem item, int startIndex, int count) -> Funcky.Monads.Option +static Funcky.Extensions.ListExtensions.LastIndexOfOrNone(this System.Collections.Immutable.IImmutableList! list, TItem item, int startIndex, int count, System.Collections.Generic.IEqualityComparer? equalityComparer) -> Funcky.Monads.Option +static Funcky.Extensions.ListExtensions.LastIndexOfOrNone(this System.Collections.Immutable.IImmutableList! list, TItem item, System.Collections.Generic.IEqualityComparer? equalityComparer) -> Funcky.Monads.Option static Funcky.Extensions.OrderedDictionaryExtensions.IndexOfOrNone(this System.Collections.Generic.OrderedDictionary! dictionary, TKey key) -> Funcky.Monads.Option static Funcky.Extensions.ParseExtensions.ParseIPNetworkOrNone(this string? candidate) -> Funcky.Monads.Option static Funcky.Extensions.ParseExtensions.ParseIPNetworkOrNone(this System.ReadOnlySpan candidate) -> Funcky.Monads.Option