Skip to content

Commit ae05041

Browse files
[ADD] Enumerable.LastOrNone
1 parent ca8a3e3 commit ae05041

File tree

3 files changed

+165
-0
lines changed

3 files changed

+165
-0
lines changed

src/AInq.Optional.Async/MaybeAsync.Linq.Enumerator.cs

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,45 @@ public async ValueTask<Maybe<T>> FirstOrNoneAsync([InstantHandle(RequireAwait =
9898
return enumerator.Current;
9999
return Maybe.None<T>();
100100
}
101+
102+
/// <inheritdoc cref="Maybe.LastOrNone{T}(IEnumerable{T})" />
103+
[PublicAPI]
104+
public async ValueTask<Maybe<T>> LastOrNoneAsync(CancellationToken cancellation = default)
105+
{
106+
_ = collection ?? throw new ArgumentNullException(nameof(collection));
107+
var result = Maybe.None<T>();
108+
await foreach (var value in collection.WithCancellation(cancellation).ConfigureAwait(false))
109+
result = value;
110+
return result;
111+
}
112+
113+
/// <inheritdoc cref="Maybe.LastOrNone{T}(IEnumerable{T},Func{T,bool})" />
114+
[PublicAPI]
115+
public async ValueTask<Maybe<T>> LastOrNoneAsync([InstantHandle(RequireAwait = true)] Func<T, bool> filter,
116+
CancellationToken cancellation = default)
117+
{
118+
_ = collection ?? throw new ArgumentNullException(nameof(collection));
119+
_ = filter ?? throw new ArgumentNullException(nameof(filter));
120+
var result = Maybe.None<T>();
121+
await foreach(var value in collection.WithCancellation(cancellation).ConfigureAwait(false))
122+
if (filter.Invoke(value))
123+
result = value;
124+
return result;
125+
}
126+
127+
/// <inheritdoc cref="Maybe.LastOrNone{T}(IEnumerable{T},Func{T,bool})" />
128+
[PublicAPI]
129+
public async ValueTask<Maybe<T>> LastOrNoneAsync([InstantHandle(RequireAwait = true)] Func<T, CancellationToken, ValueTask<bool>> filter,
130+
CancellationToken cancellation = default)
131+
{
132+
_ = collection ?? throw new ArgumentNullException(nameof(collection));
133+
_ = filter ?? throw new ArgumentNullException(nameof(filter));
134+
var result = Maybe.None<T>();
135+
await foreach(var value in collection.WithCancellation(cancellation).ConfigureAwait(false))
136+
if (await filter.Invoke(value, cancellation).ConfigureAwait(false))
137+
result = value;
138+
return result;
139+
}
101140

102141
/// <inheritdoc cref="Maybe.SingleOrNone{T}(IEnumerable{T})" />
103142
[PublicAPI]
@@ -169,6 +208,18 @@ public async ValueTask<Maybe<T>> FirstNotNullOrNoneAsync(CancellationToken cance
169208
return enumerator.Current;
170209
return Maybe.None<T>();
171210
}
211+
212+
/// <inheritdoc cref="Maybe.LastNotNullOrNone{T}(IEnumerable{T?})" />
213+
[PublicAPI]
214+
public async ValueTask<Maybe<T>> LastNotNullOrNoneAsync(CancellationToken cancellation = default)
215+
{
216+
_ = collection ?? throw new ArgumentNullException(nameof(collection));
217+
var result = Maybe.None<T>();
218+
await foreach(var value in collection.WithCancellation(cancellation).ConfigureAwait(false))
219+
if (value is not null)
220+
result = value;
221+
return result;
222+
}
172223

173224
/// <inheritdoc cref="Maybe.SingleNotNullOrNone{T}(IEnumerable{T?})" />
174225
[PublicAPI]
@@ -205,6 +256,18 @@ public async ValueTask<Maybe<T>> FirstNotNullOrNoneAsync(CancellationToken cance
205256
return enumerator.Current.Value;
206257
return Maybe.None<T>();
207258
}
259+
260+
/// <inheritdoc cref="Maybe.LastNotNullOrNone{T}(IEnumerable{T?})" />
261+
[PublicAPI]
262+
public async ValueTask<Maybe<T>> LastNotNullOrNoneAsync(CancellationToken cancellation = default)
263+
{
264+
_ = collection ?? throw new ArgumentNullException(nameof(collection));
265+
var result = Maybe.None<T>();
266+
await foreach(var value in collection.WithCancellation(cancellation).ConfigureAwait(false))
267+
if (value.HasValue)
268+
result = value;
269+
return result;
270+
}
208271

209272
/// <inheritdoc cref="Maybe.SingleNotNullOrNone{T}(IEnumerable{T?})" />
210273
[PublicAPI]

src/AInq.Optional.Async/MaybeAsync.Linq.Query.cs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,34 @@ public async ValueTask<Maybe<T>> FirstOrNoneAsync([InstantHandle(RequireAwait =
8080
_ = filter ?? throw new ArgumentNullException(nameof(filter));
8181
return await collection.Where(filter).Select(Maybe<T>.FromValue).FirstOrDefaultAsync(Maybe.None<T>(), cancellation).ConfigureAwait(false);
8282
}
83+
84+
/// <inheritdoc cref="Maybe.LastOrNone{T}(IEnumerable{T})" />
85+
[PublicAPI]
86+
public async ValueTask<Maybe<T>> LastOrNoneAsync(CancellationToken cancellation = default)
87+
{
88+
_ = collection ?? throw new ArgumentNullException(nameof(collection));
89+
return await collection.Select(Maybe<T>.FromValue).LastOrDefaultAsync(Maybe.None<T>(), cancellation).ConfigureAwait(false);
90+
}
91+
92+
/// <inheritdoc cref="Maybe.LastOrNone{T}(IEnumerable{T},Func{T,bool})" />
93+
[PublicAPI]
94+
public async ValueTask<Maybe<T>> LastOrNoneAsync([InstantHandle(RequireAwait = true)] Func<T, bool> filter,
95+
CancellationToken cancellation = default)
96+
{
97+
_ = collection ?? throw new ArgumentNullException(nameof(collection));
98+
_ = filter ?? throw new ArgumentNullException(nameof(filter));
99+
return await collection.Where(filter).Select(Maybe<T>.FromValue).LastOrDefaultAsync(Maybe.None<T>(), cancellation).ConfigureAwait(false);
100+
}
101+
102+
/// <inheritdoc cref="Maybe.LastOrNone{T}(IEnumerable{T},Func{T,bool})" />
103+
[PublicAPI]
104+
public async ValueTask<Maybe<T>> LastOrNoneAsync([InstantHandle(RequireAwait = true)] Func<T, CancellationToken, ValueTask<bool>> filter,
105+
CancellationToken cancellation = default)
106+
{
107+
_ = collection ?? throw new ArgumentNullException(nameof(collection));
108+
_ = filter ?? throw new ArgumentNullException(nameof(filter));
109+
return await collection.Where(filter).Select(Maybe<T>.FromValue).LastOrDefaultAsync(Maybe.None<T>(), cancellation).ConfigureAwait(false);
110+
}
83111

84112
/// <inheritdoc cref="Maybe.SingleOrNone{T}(IEnumerable{T})" />
85113
[PublicAPI]
@@ -130,6 +158,16 @@ public async ValueTask<Maybe<T>> FirstNotNullOrNoneAsync(CancellationToken cance
130158
.FirstOrDefaultAsync(maybe => maybe.HasValue, Maybe<T>.None, cancellation)
131159
.ConfigureAwait(false);
132160
}
161+
162+
/// <inheritdoc cref="Maybe.LastNotNullOrNone{T}(IEnumerable{T?})" />
163+
[PublicAPI]
164+
public async ValueTask<Maybe<T>> LastNotNullOrNoneAsync(CancellationToken cancellation = default)
165+
{
166+
_ = collection ?? throw new ArgumentNullException(nameof(collection));
167+
return await collection.Select(Maybe.ValueIfNotNull)
168+
.LastOrDefaultAsync(maybe => maybe.HasValue, Maybe<T>.None, cancellation)
169+
.ConfigureAwait(false);
170+
}
133171

134172
/// <inheritdoc cref="Maybe.SingleNotNullOrNone{T}(IEnumerable{T?})" />
135173
[PublicAPI]
@@ -156,6 +194,16 @@ public async ValueTask<Maybe<T>> FirstNotNullOrNoneAsync(CancellationToken cance
156194
.FirstOrDefaultAsync(maybe => maybe.HasValue, Maybe<T>.None, cancellation)
157195
.ConfigureAwait(false);
158196
}
197+
198+
/// <inheritdoc cref="Maybe.LastNotNullOrNone{T}(IEnumerable{T?})" />
199+
[PublicAPI]
200+
public async ValueTask<Maybe<T>> LastNotNullOrNoneAsync(CancellationToken cancellation = default)
201+
{
202+
_ = collection ?? throw new ArgumentNullException(nameof(collection));
203+
return await collection.Select(Maybe.ValueIfNotNull)
204+
.LastOrDefaultAsync(maybe => maybe.HasValue, Maybe<T>.None, cancellation)
205+
.ConfigureAwait(false);
206+
}
159207

160208
/// <inheritdoc cref="Maybe.SingleNotNullOrNone{T}(IEnumerable{T?})" />
161209
[PublicAPI]

src/AInq.Optional/Maybe.Linq.cs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,34 @@ public Maybe<T> FirstOrNone([InstantHandle] Func<T, bool> filter)
9494
return collection.Where(filter).Select(Maybe<T>.FromValue).FirstOrDefault(Maybe<T>.None);
9595
#endif
9696
}
97+
98+
/// <summary> Get last value or none </summary>
99+
/// <returns> Maybe </returns>
100+
[PublicAPI]
101+
public Maybe<T> LastOrNone()
102+
{
103+
_ = collection ?? throw new ArgumentNullException(nameof(collection));
104+
#if NETSTANDARD
105+
return collection.Select(Maybe<T>.FromValue).LastOrDefault() ?? Maybe<T>.None;
106+
#else
107+
return collection.Select(Maybe<T>.FromValue).LastOrDefault(Maybe<T>.None);
108+
#endif
109+
}
110+
111+
/// <summary> Get last matching value or none </summary>
112+
/// <param name="filter"> Filter </param>
113+
/// <returns> Maybe </returns>
114+
[PublicAPI]
115+
public Maybe<T> LastOrNone([InstantHandle] Func<T, bool> filter)
116+
{
117+
_ = collection ?? throw new ArgumentNullException(nameof(collection));
118+
_ = filter ?? throw new ArgumentNullException(nameof(filter));
119+
#if NETSTANDARD
120+
return collection.Where(filter).Select(Maybe<T>.FromValue).LastOrDefault() ?? Maybe<T>.None;
121+
#else
122+
return collection.Where(filter).Select(Maybe<T>.FromValue).LastOrDefault(Maybe<T>.None);
123+
#endif
124+
}
97125

98126
/// <summary> Get single value or none </summary>
99127
/// <returns> Maybe </returns>
@@ -143,6 +171,19 @@ public Maybe<T> FirstNotNullOrNone()
143171
return collection.Select(ValueIfNotNull).FirstOrDefault(maybe => maybe.HasValue, Maybe<T>.None);
144172
#endif
145173
}
174+
175+
/// <summary> Get last not null value or none </summary>
176+
/// <returns> Maybe </returns>
177+
[PublicAPI]
178+
public Maybe<T> LastNotNullOrNone()
179+
{
180+
_ = collection ?? throw new ArgumentNullException(nameof(collection));
181+
#if NETSTANDARD
182+
return collection.Select(ValueIfNotNull).LastOrDefault(maybe => maybe.HasValue) ?? Maybe<T>.None;
183+
#else
184+
return collection.Select(ValueIfNotNull).LastOrDefault(maybe => maybe.HasValue, Maybe<T>.None);
185+
#endif
186+
}
146187

147188
/// <summary> Get single not null value or none </summary>
148189
/// <returns> Maybe </returns>
@@ -175,6 +216,19 @@ public Maybe<T> FirstNotNullOrNone()
175216
return collection.Select(ValueIfNotNull).FirstOrDefault(maybe => maybe.HasValue, Maybe<T>.None);
176217
#endif
177218
}
219+
220+
/// <summary> Get last not null value or none </summary>
221+
/// <returns> Maybe </returns>
222+
[PublicAPI]
223+
public Maybe<T> LastNotNullOrNone()
224+
{
225+
_ = collection ?? throw new ArgumentNullException(nameof(collection));
226+
#if NETSTANDARD
227+
return collection.Select(ValueIfNotNull).LastOrDefault(maybe => maybe.HasValue) ?? Maybe<T>.None;
228+
#else
229+
return collection.Select(ValueIfNotNull).LastOrDefault(maybe => maybe.HasValue, Maybe<T>.None);
230+
#endif
231+
}
178232

179233
/// <inheritdoc cref="SingleNotNullOrNone{T}(IEnumerable{T})" />
180234
[PublicAPI]

0 commit comments

Comments
 (0)