Skip to content

Commit ca50fb0

Browse files
committed
result option cancellation token support
1 parent d38a522 commit ca50fb0

File tree

1 file changed

+43
-20
lines changed

1 file changed

+43
-20
lines changed

src/Danom/ResultOption/ResultOptionTask.cs

+43-20
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,18 @@ public static class ResultOptionTaskExtensions
1717
/// <param name="ok"></param>
1818
/// <param name="none"></param>
1919
/// <param name="error"></param>
20+
/// <param name="cancellationToken"></param>
2021
/// <returns></returns>
2122
public static async Task<U> MatchAsync<T, TError, U>(
2223
this Task<ResultOption<T, TError>> resultOptionTask,
2324
Func<T, Task<U>> ok,
2425
Func<Task<U>> none,
25-
Func<TError, Task<U>> error) =>
26-
await (await resultOptionTask).Match(ok, none, error);
26+
Func<TError, Task<U>> error,
27+
CancellationToken? cancellationToken = null)
28+
{
29+
var option = await resultOptionTask.WaitOrCancel(cancellationToken);
30+
return await option.Match(ok, none, error).WaitOrCancel(cancellationToken);
31+
}
2732

2833
/// <summary>
2934
/// If ResultOption is Ok evaluate the ok delegate, otherwise none. If
@@ -36,13 +41,15 @@ public static async Task<U> MatchAsync<T, TError, U>(
3641
/// <param name="ok"></param>
3742
/// <param name="none"></param>
3843
/// <param name="error"></param>
44+
/// <param name="cancellationToken"></param>
3945
/// <returns></returns>
4046
public static async Task<U> MatchAsync<T, TError, U>(
4147
this Task<ResultOption<T, TError>> resultOptionTask,
4248
Func<T, U> ok,
4349
Func<U> none,
44-
Func<TError, U> error) =>
45-
(await resultOptionTask).Match(ok, none, error);
50+
Func<TError, U> error,
51+
CancellationToken? cancellationToken = null) =>
52+
(await resultOptionTask.WaitOrCancel(cancellationToken)).Match(ok, none, error);
4653

4754
/// <summary>
4855
/// Evaluates the bind delegate if ResultOption is Ok.
@@ -52,11 +59,13 @@ public static async Task<U> MatchAsync<T, TError, U>(
5259
/// <typeparam name="U"></typeparam>
5360
/// <param name="resultOptionTask"></param>
5461
/// <param name="bind"></param>
62+
/// <param name="cancellationToken"></param>
5563
/// <returns></returns>
5664
public static Task<ResultOption<U, TError>> BindAsync<T, TError, U>(
5765
this Task<ResultOption<T, TError>> resultOptionTask,
58-
Func<T, ResultOption<U, TError>> bind) =>
59-
resultOptionTask.MatchAsync(x => bind(x), ResultOption<U, TError>.None, ResultOption<U, TError>.Error);
66+
Func<T, ResultOption<U, TError>> bind,
67+
CancellationToken? cancellationToken = null) =>
68+
resultOptionTask.MatchAsync(x => bind(x), ResultOption<U, TError>.None, ResultOption<U, TError>.Error, cancellationToken);
6069

6170
/// <summary>
6271
/// Evaluates the bind delegate if ResultOption is Ok.
@@ -66,11 +75,13 @@ public static Task<ResultOption<U, TError>> BindAsync<T, TError, U>(
6675
/// <typeparam name="U"></typeparam>
6776
/// <param name="resultOptionTask"></param>
6877
/// <param name="bind"></param>
78+
/// <param name="cancellationToken"></param>
6979
/// <returns></returns>
7080
public static Task<ResultOption<U, TError>> BindAsync<T, TError, U>(
7181
this Task<ResultOption<T, TError>> resultOptionTask,
72-
Func<T, Task<ResultOption<U, TError>>> bind) =>
73-
resultOptionTask.MatchAsync(bind, ResultOption<U, TError>.NoneAsync, ResultOption<U, TError>.ErrorAsync);
82+
Func<T, Task<ResultOption<U, TError>>> bind,
83+
CancellationToken? cancellationToken = null) =>
84+
resultOptionTask.MatchAsync(bind, ResultOption<U, TError>.NoneAsync, ResultOption<U, TError>.ErrorAsync, cancellationToken);
7485

7586
/// <summary>
7687
/// Evaluates the map delegate if ResultOption is Ok.
@@ -80,11 +91,13 @@ public static Task<ResultOption<U, TError>> BindAsync<T, TError, U>(
8091
/// <typeparam name="U"></typeparam>
8192
/// <param name="resultOptionTask"></param>
8293
/// <param name="map"></param>
94+
/// <param name="cancellationToken"></param>
8395
/// <returns></returns>
8496
public static Task<ResultOption<U, TError>> MapAsync<T, TError, U>(
8597
this Task<ResultOption<T, TError>> resultOptionTask,
86-
Func<T, U> map) =>
87-
resultOptionTask.BindAsync(x => ResultOption<U, TError>.Ok(map(x)));
98+
Func<T, U> map,
99+
CancellationToken? cancellationToken = null) =>
100+
resultOptionTask.BindAsync(x => ResultOption<U, TError>.Ok(map(x)), cancellationToken);
88101

89102
/// <summary>
90103
/// Evaluates the map delegate if ResultOption is Ok.
@@ -94,11 +107,13 @@ public static Task<ResultOption<U, TError>> MapAsync<T, TError, U>(
94107
/// <typeparam name="U"></typeparam>
95108
/// <param name="resultOptionTask"></param>
96109
/// <param name="map"></param>
110+
/// <param name="cancellationToken"></param>
97111
/// <returns></returns>
98112
public static Task<ResultOption<U, TError>> MapAsync<T, TError, U>(
99113
this Task<ResultOption<T, TError>> resultOptionTask,
100-
Func<T, Task<U>> map) =>
101-
resultOptionTask.BindAsync(x => ResultOption<U, TError>.OkAsync(map(x)));
114+
Func<T, Task<U>> map,
115+
CancellationToken? cancellationToken = null) =>
116+
resultOptionTask.BindAsync(x => ResultOption<U, TError>.OkAsync(map(x)), cancellationToken);
102117

103118
/// <summary>
104119
/// Returns the value of ResultOption if it is Ok, otherwise return the
@@ -108,11 +123,13 @@ public static Task<ResultOption<U, TError>> MapAsync<T, TError, U>(
108123
/// <typeparam name="TError"></typeparam>
109124
/// <param name="resultOptionTask"></param>
110125
/// <param name="defaultValue"></param>
126+
/// <param name="cancellationToken"></param>
111127
/// <returns></returns>
112128
public static Task<T> DefaultValueAsync<T, TError>(
113129
this Task<ResultOption<T, TError>> resultOptionTask,
114-
T defaultValue) =>
115-
resultOptionTask.MatchAsync(ok => ok, () => defaultValue, _ => defaultValue);
130+
T defaultValue,
131+
CancellationToken? cancellationToken = null) =>
132+
resultOptionTask.MatchAsync(ok => ok, () => defaultValue, _ => defaultValue, cancellationToken);
116133

117134
/// <summary>
118135
/// Returns the value of ResultOption if it is Ok, otherwise evaluate the
@@ -122,11 +139,13 @@ public static Task<T> DefaultValueAsync<T, TError>(
122139
/// <typeparam name="TError"></typeparam>
123140
/// <param name="resultTask"></param>
124141
/// <param name="defaultValue"></param>
142+
/// <param name="cancellationToken"></param>
125143
/// <returns></returns>
126144
public static Task<T> DefaultValueAsync<T, TError>(
127145
this Task<ResultOption<T, TError>> resultTask,
128-
Task<T> defaultValue) =>
129-
resultTask.MatchAsync(some => Task.FromResult(some), () => defaultValue, _ => defaultValue);
146+
Task<T> defaultValue,
147+
CancellationToken? cancellationToken = null) =>
148+
resultTask.MatchAsync(some => Task.FromResult(some), () => defaultValue, _ => defaultValue, cancellationToken);
130149

131150
/// <summary>
132151
/// Returns the value of ResultOption if it is Ok, otherwise return the
@@ -136,11 +155,13 @@ public static Task<T> DefaultValueAsync<T, TError>(
136155
/// <typeparam name="TError"></typeparam>
137156
/// <param name="resultOptionTask"></param>
138157
/// <param name="defaultWith"></param>
158+
/// <param name="cancellationToken"></param>
139159
/// <returns></returns>
140160
public static Task<T> DefaultWithAsync<T, TError>(
141161
this Task<ResultOption<T, TError>> resultOptionTask,
142-
Func<Task<T>> defaultWith) =>
143-
resultOptionTask.MatchAsync(ok => Task.FromResult(ok), defaultWith, _ => defaultWith());
162+
Func<Task<T>> defaultWith,
163+
CancellationToken? cancellationToken = null) =>
164+
resultOptionTask.MatchAsync(ok => Task.FromResult(ok), defaultWith, _ => defaultWith(), cancellationToken);
144165

145166
/// <summary>
146167
/// Returns the value of ResultOption if it is Ok, otherwise evaluate the
@@ -150,9 +171,11 @@ public static Task<T> DefaultWithAsync<T, TError>(
150171
/// <typeparam name="TError"></typeparam>
151172
/// <param name="resultOptionTask"></param>
152173
/// <param name="defaultWith"></param>
174+
/// <param name="cancellationToken"></param>
153175
/// <returns></returns>
154176
public static Task<T> DefaultWithAsync<T, TError>(
155177
this Task<ResultOption<T, TError>> resultOptionTask,
156-
Func<T> defaultWith) =>
157-
resultOptionTask.MatchAsync(ok => ok, defaultWith, _ => defaultWith());
178+
Func<T> defaultWith,
179+
CancellationToken? cancellationToken = null) =>
180+
resultOptionTask.MatchAsync(ok => ok, defaultWith, _ => defaultWith(), cancellationToken);
158181
}

0 commit comments

Comments
 (0)