Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Resolve ambiguity of .IndexOfOrNone extension method #855

Merged
merged 4 commits into from
Mar 3, 2025
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -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<string>.Empty.IndexOfOrNone("foo");
_ = ImmutableList<string>.Empty.IndexOfOrNone("foo");
}
}
Original file line number Diff line number Diff line change
@@ -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
{
/// <summary>
/// Searches for the specified object and returns the zero-based index of the first occurrence within the range of elements in the <see cref="IImmutableList{T}" /> that starts at the specified index and contains the specified number of elements.
Expand All @@ -25,6 +26,7 @@ public static Option<int> IndexOfOrNone<TItem>(this IImmutableList<TItem> list,
/// <param name="list">An <see cref="IImmutableList{T}" /> of values.</param>
/// <param name="item">The object to locate in the <see cref="T:System.Collections.Immutable.IImmutableList`1" />. This value can be null for reference types.</param>
/// <returns>The zero-based index of the first occurrence of <paramref name="item" /> within the range of elements in the <see cref="IImmutableList{T}" /> if found; otherwise <see cref="Option{T}.None" />.</returns>
[OverloadResolutionPriority(1)]
public static Option<int> IndexOfOrNone<TItem>(this IImmutableList<TItem> list, TItem item)
=> MapNotFoundToNone(list.IndexOf(item));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

namespace Funcky.Extensions;

public static partial class ImmutableListExtensions
public static partial class ListExtensions
{
/// <summary>
/// Searches for the specified object and returns the zero-based index of the last occurrence within the range of elements in the <see cref="IImmutableList{T}" /> that contains the specified number of elements and ends at the specified index.
Expand Down
10 changes: 10 additions & 0 deletions Funcky/Extensions/ListExtensions/IList.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using static Funcky.Internal.ValueMapper;

namespace Funcky.Extensions;

public static partial class ListExtensions
{
[Pure]
public static Option<int> IndexOfOrNone<TValue>(this IList<TValue> list, TValue value)
=> MapNotFoundToNone(list.IndexOf(value));
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,8 @@

namespace Funcky.Extensions;

public static class ListExtensions
public static partial 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));
Expand Down
60 changes: 60 additions & 0 deletions Funcky/Obsolete/ImmutableListExtensions/IndexOfOrNone.cs
Original file line number Diff line number Diff line change
@@ -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<int> IndexOfOrNone<TItem>(IImmutableList<TItem> list, TItem item, int startIndex, int count, IEqualityComparer<TItem>? equalityComparer)
=> MapNotFoundToNone(list.IndexOf(item, startIndex, count, equalityComparer));

[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete($"Use {nameof(ListExtensions)}.{nameof(IndexOfOrNone)} instead.")]
public static Option<int> IndexOfOrNone<TItem>(IImmutableList<TItem> list, TItem item)
=> MapNotFoundToNone(list.IndexOf(item));

[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete($"Use {nameof(ListExtensions)}.{nameof(IndexOfOrNone)} instead.")]
public static Option<int> IndexOfOrNone<TItem>(IImmutableList<TItem> list, TItem item, IEqualityComparer<TItem>? equalityComparer)
=> MapNotFoundToNone(list.IndexOf(item, equalityComparer));

[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete($"Use {nameof(ListExtensions)}.{nameof(IndexOfOrNone)} instead.")]
public static Option<int> IndexOfOrNone<TItem>(IImmutableList<TItem> list, TItem item, int startIndex)
=> MapNotFoundToNone(list.IndexOf(item, startIndex));

[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete($"Use {nameof(ListExtensions)}.{nameof(IndexOfOrNone)} instead.")]
public static Option<int> IndexOfOrNone<TItem>(IImmutableList<TItem> 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<int> LastIndexOfOrNone<TItem>(IImmutableList<TItem> list, TItem item, int startIndex, int count, IEqualityComparer<TItem>? equalityComparer)
=> MapNotFoundToNone(list.LastIndexOf(item, startIndex, count, equalityComparer));

[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete($"Use {nameof(ListExtensions)}.{nameof(LastIndexOfOrNone)} instead.")]
public static Option<int> LastIndexOfOrNone<TItem>(IImmutableList<TItem> list, TItem item)
=> MapNotFoundToNone(list.LastIndexOf(item));

[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete($"Use {nameof(ListExtensions)}.{nameof(LastIndexOfOrNone)} instead.")]
public static Option<int> LastIndexOfOrNone<TItem>(IImmutableList<TItem> list, TItem item, IEqualityComparer<TItem>? equalityComparer)
=> MapNotFoundToNone(list.LastIndexOf(item, equalityComparer));

[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete($"Use {nameof(ListExtensions)}.{nameof(LastIndexOfOrNone)} instead.")]
public static Option<int> LastIndexOfOrNone<TItem>(IImmutableList<TItem> list, TItem item, int startIndex)
=> MapNotFoundToNone(list.LastIndexOf(item, startIndex));

[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete($"Use {nameof(ListExtensions)}.{nameof(LastIndexOfOrNone)} instead.")]
public static Option<int> LastIndexOfOrNone<TItem>(IImmutableList<TItem> list, TItem item, int startIndex, int count)
=> MapNotFoundToNone(list.LastIndexOf(item, startIndex, count));
}
20 changes: 10 additions & 10 deletions Funcky/PublicAPI.Shipped.txt
Original file line number Diff line number Diff line change
Expand Up @@ -363,16 +363,16 @@ static Funcky.Extensions.FuncExtensions.Uncurry<T1, T2, T3, TResult>(this System
static Funcky.Extensions.FuncExtensions.Uncurry<T1, T2, TResult>(this System.Func<T1, System.Func<T2, TResult>!>! function) -> System.Func<T1, T2, TResult>!
static Funcky.Extensions.HttpHeadersExtensions.GetValuesOrNone(this System.Net.Http.Headers.HttpHeaders! headers, string! name) -> Funcky.Monads.Option<System.Collections.Generic.IEnumerable<string!>!>
static Funcky.Extensions.HttpHeadersNonValidatedExtensions.GetValuesOrNone(this System.Net.Http.Headers.HttpHeadersNonValidated headers, string! headerName) -> Funcky.Monads.Option<System.Net.Http.Headers.HeaderStringValues>
static Funcky.Extensions.ImmutableListExtensions.IndexOfOrNone<TItem>(this System.Collections.Immutable.IImmutableList<TItem>! list, TItem item) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ImmutableListExtensions.IndexOfOrNone<TItem>(this System.Collections.Immutable.IImmutableList<TItem>! list, TItem item, int startIndex) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ImmutableListExtensions.IndexOfOrNone<TItem>(this System.Collections.Immutable.IImmutableList<TItem>! list, TItem item, int startIndex, int count) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ImmutableListExtensions.IndexOfOrNone<TItem>(this System.Collections.Immutable.IImmutableList<TItem>! list, TItem item, int startIndex, int count, System.Collections.Generic.IEqualityComparer<TItem>? equalityComparer) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ImmutableListExtensions.IndexOfOrNone<TItem>(this System.Collections.Immutable.IImmutableList<TItem>! list, TItem item, System.Collections.Generic.IEqualityComparer<TItem>? equalityComparer) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ImmutableListExtensions.LastIndexOfOrNone<TItem>(this System.Collections.Immutable.IImmutableList<TItem>! list, TItem item) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ImmutableListExtensions.LastIndexOfOrNone<TItem>(this System.Collections.Immutable.IImmutableList<TItem>! list, TItem item, int startIndex) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ImmutableListExtensions.LastIndexOfOrNone<TItem>(this System.Collections.Immutable.IImmutableList<TItem>! list, TItem item, int startIndex, int count) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ImmutableListExtensions.LastIndexOfOrNone<TItem>(this System.Collections.Immutable.IImmutableList<TItem>! list, TItem item, int startIndex, int count, System.Collections.Generic.IEqualityComparer<TItem>? equalityComparer) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ImmutableListExtensions.LastIndexOfOrNone<TItem>(this System.Collections.Immutable.IImmutableList<TItem>! list, TItem item, System.Collections.Generic.IEqualityComparer<TItem>? equalityComparer) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ImmutableListExtensions.IndexOfOrNone<TItem>(System.Collections.Immutable.IImmutableList<TItem>! list, TItem item) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ImmutableListExtensions.IndexOfOrNone<TItem>(System.Collections.Immutable.IImmutableList<TItem>! list, TItem item, int startIndex) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ImmutableListExtensions.IndexOfOrNone<TItem>(System.Collections.Immutable.IImmutableList<TItem>! list, TItem item, int startIndex, int count) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ImmutableListExtensions.IndexOfOrNone<TItem>(System.Collections.Immutable.IImmutableList<TItem>! list, TItem item, int startIndex, int count, System.Collections.Generic.IEqualityComparer<TItem>? equalityComparer) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ImmutableListExtensions.IndexOfOrNone<TItem>(System.Collections.Immutable.IImmutableList<TItem>! list, TItem item, System.Collections.Generic.IEqualityComparer<TItem>? equalityComparer) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ImmutableListExtensions.LastIndexOfOrNone<TItem>(System.Collections.Immutable.IImmutableList<TItem>! list, TItem item) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ImmutableListExtensions.LastIndexOfOrNone<TItem>(System.Collections.Immutable.IImmutableList<TItem>! list, TItem item, int startIndex) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ImmutableListExtensions.LastIndexOfOrNone<TItem>(System.Collections.Immutable.IImmutableList<TItem>! list, TItem item, int startIndex, int count) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ImmutableListExtensions.LastIndexOfOrNone<TItem>(System.Collections.Immutable.IImmutableList<TItem>! list, TItem item, int startIndex, int count, System.Collections.Generic.IEqualityComparer<TItem>? equalityComparer) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ImmutableListExtensions.LastIndexOfOrNone<TItem>(System.Collections.Immutable.IImmutableList<TItem>! list, TItem item, System.Collections.Generic.IEqualityComparer<TItem>? equalityComparer) -> Funcky.Monads.Option<int>
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>
Expand Down
10 changes: 10 additions & 0 deletions Funcky/PublicAPI.Unshipped.txt
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,16 @@ static Funcky.Extensions.FuncExtensions.Apply<T1, T2, T3, TResult>(this System.F
static Funcky.Extensions.FuncExtensions.Apply<T1, T2, TResult>(this System.Func<T1, T2, TResult>! func, Funcky.Unit p1, T2 p2) -> System.Func<T1, TResult>!
static Funcky.Extensions.FuncExtensions.Apply<T1, T2, TResult>(this System.Func<T1, T2, TResult>! func, T1 p1, Funcky.Unit p2) -> System.Func<T2, TResult>!
static Funcky.Extensions.JsonSerializerOptionsExtensions.GetTypeInfoOrNone(this System.Text.Json.JsonSerializerOptions! options, System.Type! type) -> Funcky.Monads.Option<System.Text.Json.Serialization.Metadata.JsonTypeInfo!>
static Funcky.Extensions.ListExtensions.IndexOfOrNone<TItem>(this System.Collections.Immutable.IImmutableList<TItem>! list, TItem item) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ListExtensions.IndexOfOrNone<TItem>(this System.Collections.Immutable.IImmutableList<TItem>! list, TItem item, int startIndex) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ListExtensions.IndexOfOrNone<TItem>(this System.Collections.Immutable.IImmutableList<TItem>! list, TItem item, int startIndex, int count) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ListExtensions.IndexOfOrNone<TItem>(this System.Collections.Immutable.IImmutableList<TItem>! list, TItem item, int startIndex, int count, System.Collections.Generic.IEqualityComparer<TItem>? equalityComparer) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ListExtensions.IndexOfOrNone<TItem>(this System.Collections.Immutable.IImmutableList<TItem>! list, TItem item, System.Collections.Generic.IEqualityComparer<TItem>? equalityComparer) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ListExtensions.LastIndexOfOrNone<TItem>(this System.Collections.Immutable.IImmutableList<TItem>! list, TItem item) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ListExtensions.LastIndexOfOrNone<TItem>(this System.Collections.Immutable.IImmutableList<TItem>! list, TItem item, int startIndex) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ListExtensions.LastIndexOfOrNone<TItem>(this System.Collections.Immutable.IImmutableList<TItem>! list, TItem item, int startIndex, int count) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ListExtensions.LastIndexOfOrNone<TItem>(this System.Collections.Immutable.IImmutableList<TItem>! list, TItem item, int startIndex, int count, System.Collections.Generic.IEqualityComparer<TItem>? equalityComparer) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ListExtensions.LastIndexOfOrNone<TItem>(this System.Collections.Immutable.IImmutableList<TItem>! list, TItem item, System.Collections.Generic.IEqualityComparer<TItem>? equalityComparer) -> Funcky.Monads.Option<int>
static Funcky.Extensions.OrderedDictionaryExtensions.IndexOfOrNone<TKey, TValue>(this System.Collections.Generic.OrderedDictionary<TKey, TValue>! dictionary, TKey key) -> Funcky.Monads.Option<int>
static Funcky.Extensions.ParseExtensions.ParseIPNetworkOrNone(this string? candidate) -> Funcky.Monads.Option<System.Net.IPNetwork>
static Funcky.Extensions.ParseExtensions.ParseIPNetworkOrNone(this System.ReadOnlySpan<char> candidate) -> Funcky.Monads.Option<System.Net.IPNetwork>
Expand Down