Skip to content

Commit d38a522

Browse files
committed
result cancellation token support
1 parent 7187f1b commit d38a522

File tree

1 file changed

+52
-25
lines changed

1 file changed

+52
-25
lines changed

src/Danom/Result/ResultTask.cs

+52-25
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,17 @@ public static class ResultTaskExtensions
1515
/// <param name="resultTask"></param>
1616
/// <param name="ok"></param>
1717
/// <param name="error"></param>
18+
/// <param name="cancellationToken"></param>
1819
/// <returns></returns>
1920
public static async Task<U> MatchAsync<T, TError, U>(
2021
this Task<Result<T, TError>> resultTask,
2122
Func<T, Task<U>> ok,
22-
Func<TError, Task<U>> error) =>
23-
await (await resultTask).Match(ok, error);
23+
Func<TError, Task<U>> error,
24+
CancellationToken? cancellationToken = null)
25+
{
26+
var option = await resultTask.WaitOrCancel(cancellationToken);
27+
return await option.Match(ok, error).WaitOrCancel(cancellationToken);
28+
}
2429

2530
/// <summary>
2631
/// If Result is Ok evaluate the ok delegate, otherwise error.
@@ -31,12 +36,14 @@ public static async Task<U> MatchAsync<T, TError, U>(
3136
/// <param name="resultTask"></param>
3237
/// <param name="ok"></param>
3338
/// <param name="error"></param>
39+
/// <param name="cancellationToken"></param>
3440
/// <returns></returns>
3541
public static async Task<U> MatchAsync<T, TError, U>(
3642
this Task<Result<T, TError>> resultTask,
3743
Func<T, U> ok,
38-
Func<TError, U> error) =>
39-
(await resultTask).Match(ok, error);
44+
Func<TError, U> error,
45+
CancellationToken? cancellationToken = null) =>
46+
(await resultTask.WaitOrCancel(cancellationToken)).Match(ok, error);
4047

4148
/// <summary>
4249
/// Evaluates the bind delegate if Result is Ok otherwise return Error.
@@ -46,11 +53,13 @@ public static async Task<U> MatchAsync<T, TError, U>(
4653
/// <typeparam name="U"></typeparam>
4754
/// <param name="resultTask"></param>
4855
/// <param name="bind"></param>
56+
/// <param name="cancellationToken"></param>
4957
/// <returns></returns>
5058
public static Task<Result<U, TError>> BindAsync<T, TError, U>(
5159
this Task<Result<T, TError>> resultTask,
52-
Func<T, Result<U, TError>> bind) =>
53-
resultTask.MatchAsync(x => bind(x), Result<U, TError>.Error);
60+
Func<T, Result<U, TError>> bind,
61+
CancellationToken? cancellationToken = null) =>
62+
resultTask.MatchAsync(x => bind(x), Result<U, TError>.Error, cancellationToken);
5463

5564
/// <summary>
5665
/// Evaluates the bind delegate if Result is Ok otherwise return Error.
@@ -60,11 +69,13 @@ public static Task<Result<U, TError>> BindAsync<T, TError, U>(
6069
/// <typeparam name="U"></typeparam>
6170
/// <param name="resultTask"></param>
6271
/// <param name="bind"></param>
72+
/// <param name="cancellationToken"></param>
6373
/// <returns></returns>
6474
public static Task<Result<U, TError>> BindAsync<T, TError, U>(
6575
this Task<Result<T, TError>> resultTask,
66-
Func<T, Task<Result<U, TError>>> bind) =>
67-
resultTask.MatchAsync(bind, Result<U, TError>.ErrorAsync);
76+
Func<T, Task<Result<U, TError>>> bind,
77+
CancellationToken? cancellationToken = null) =>
78+
resultTask.MatchAsync(bind, Result<U, TError>.ErrorAsync, cancellationToken);
6879

6980
/// <summary>
7081
/// Evaluates the map delegate if Result is Ok otherwise return Error.
@@ -74,11 +85,13 @@ public static Task<Result<U, TError>> BindAsync<T, TError, U>(
7485
/// <typeparam name="U"></typeparam>
7586
/// <param name="resultTask"></param>
7687
/// <param name="map"></param>
88+
/// <param name="cancellationToken"></param>
7789
/// <returns></returns>
7890
public static Task<Result<U, TError>> MapAsync<T, TError, U>(
7991
this Task<Result<T, TError>> resultTask,
80-
Func<T, U> map) =>
81-
resultTask.BindAsync(x => Result<U, TError>.Ok(map(x)));
92+
Func<T, U> map,
93+
CancellationToken? cancellationToken = null) =>
94+
resultTask.BindAsync(x => Result<U, TError>.Ok(map(x)), cancellationToken);
8295

8396
/// <summary>
8497
/// Evaluates the map delegate if Result is Ok otherwise return Error.
@@ -88,11 +101,13 @@ public static Task<Result<U, TError>> MapAsync<T, TError, U>(
88101
/// <typeparam name="U"></typeparam>
89102
/// <param name="resultTask"></param>
90103
/// <param name="map"></param>
104+
/// <param name="cancellationToken"></param>
91105
/// <returns></returns>
92106
public static Task<Result<U, TError>> MapAsync<T, TError, U>(
93107
this Task<Result<T, TError>> resultTask,
94-
Func<T, Task<U>> map) =>
95-
resultTask.BindAsync(x => Result<U, TError>.OkAsync(map(x)));
108+
Func<T, Task<U>> map,
109+
CancellationToken? cancellationToken = null) =>
110+
resultTask.BindAsync(x => Result<U, TError>.OkAsync(map(x)), cancellationToken);
96111

97112
/// <summary>
98113
/// Evaluates the mapError delegate if Result is Error otherwise return Ok.
@@ -101,24 +116,28 @@ public static Task<Result<U, TError>> MapAsync<T, TError, U>(
101116
/// <typeparam name="UError"></typeparam>
102117
/// <param name="resultTask"></param>
103118
/// <param name="mapError"></param>
119+
/// <param name="cancellationToken"></param>
104120
/// <returns></returns>
105121
public static Task<Result<T, UError>> MapErrorAsync<T, UError>(
106122
this Task<Result<T, UError>> resultTask,
107-
Func<UError, UError> mapError) =>
108-
resultTask.MatchAsync(Result<T, UError>.Ok, e => Result<T, UError>.Error(mapError(e)));
123+
Func<UError, UError> mapError,
124+
CancellationToken? cancellationToken = null) =>
125+
resultTask.MatchAsync(Result<T, UError>.Ok, e => Result<T, UError>.Error(mapError(e)), cancellationToken);
109126

110-
/// <summary>
127+
/// <summary>
111128
/// Evaluates the mapError delegate if Result is Error otherwise return Ok.
112129
/// </summary>
113130
/// <typeparam name="T"></typeparam>
114131
/// <typeparam name="UError"></typeparam>
115132
/// <param name="resultTask"></param>
116133
/// <param name="mapError"></param>
134+
/// <param name="cancellationToken"></param>
117135
/// <returns></returns>
118136
public static Task<Result<T, UError>> MapErrorAsync<T, UError>(
119137
this Task<Result<T, UError>> resultTask,
120-
Func<UError, Task<UError>> mapError) =>
121-
resultTask.MatchAsync(Result<T, UError>.OkAsync, e => Result<T, UError>.ErrorAsync(mapError(e)));
138+
Func<UError, Task<UError>> mapError,
139+
CancellationToken? cancellationToken = null) =>
140+
resultTask.MatchAsync(Result<T, UError>.OkAsync, e => Result<T, UError>.ErrorAsync(mapError(e)), cancellationToken);
122141

123142
/// <summary>
124143
/// Returns the value of Result if it is T, otherwise returns the
@@ -128,11 +147,13 @@ public static Task<Result<T, UError>> MapErrorAsync<T, UError>(
128147
/// <typeparam name="TError"></typeparam>
129148
/// <param name="resultTask"></param>
130149
/// <param name="defaultValue"></param>
150+
/// <param name="cancellationToken"></param>
131151
/// <returns></returns>
132152
public static Task<T> DefaultValueAsync<T, TError>(
133153
this Task<Result<T, TError>> resultTask,
134-
T defaultValue) =>
135-
resultTask.MatchAsync(ok => ok, _ => defaultValue);
154+
T defaultValue,
155+
CancellationToken? cancellationToken = null) =>
156+
resultTask.MatchAsync(ok => ok, _ => defaultValue, cancellationToken);
136157

137158
/// <summary>
138159
/// Returns the value of Result if it is T, otherwise returns the
@@ -142,11 +163,13 @@ public static Task<T> DefaultValueAsync<T, TError>(
142163
/// <typeparam name="TError"></typeparam>
143164
/// <param name="resultTask"></param>
144165
/// <param name="defaultValue"></param>
166+
/// <param name="cancellationToken"></param>
145167
/// <returns></returns>
146168
public static Task<T> DefaultValueAsync<T, TError>(
147169
this Task<Result<T, TError>> resultTask,
148-
Task<T> defaultValue) =>
149-
resultTask.MatchAsync(some => Task.FromResult(some), _ => defaultValue);
170+
Task<T> defaultValue,
171+
CancellationToken? cancellationToken = null) =>
172+
resultTask.MatchAsync(some => Task.FromResult(some), _ => defaultValue, cancellationToken);
150173

151174
/// <summary>
152175
/// Returns the value of Result if it is T, otherwise returns the
@@ -156,11 +179,13 @@ public static Task<T> DefaultValueAsync<T, TError>(
156179
/// <typeparam name="TError"></typeparam>
157180
/// <param name="resultTask"></param>
158181
/// <param name="defaultWith"></param>
182+
/// <param name="cancellationToken"></param>
159183
/// <returns></returns>
160184
public static Task<T> DefaultWithAsync<T, TError>(
161185
this Task<Result<T, TError>> resultTask,
162-
Func<Task<T>> defaultWith) =>
163-
resultTask.MatchAsync(ok => Task.FromResult(ok), _ => defaultWith());
186+
Func<Task<T>> defaultWith,
187+
CancellationToken? cancellationToken = null) =>
188+
resultTask.MatchAsync(ok => Task.FromResult(ok), _ => defaultWith(), cancellationToken);
164189

165190
/// <summary>
166191
/// Returns the value of Result if it is T, otherwise returns the
@@ -170,9 +195,11 @@ public static Task<T> DefaultWithAsync<T, TError>(
170195
/// <typeparam name="TError"></typeparam>
171196
/// <param name="resultTask"></param>
172197
/// <param name="defaultWith"></param>
198+
/// <param name="cancellationToken"></param>
173199
/// <returns></returns>
174200
public static Task<T> DefaultWithAsync<T, TError>(
175201
this Task<Result<T, TError>> resultTask,
176-
Func<T> defaultWith) =>
177-
resultTask.MatchAsync(ok => ok, _ => defaultWith());
202+
Func<T> defaultWith,
203+
CancellationToken? cancellationToken = null) =>
204+
resultTask.MatchAsync(ok => ok, _ => defaultWith(), cancellationToken);
178205
}

0 commit comments

Comments
 (0)