Skip to content

Commit e75f56d

Browse files
committed
Add map, when to result and option
1 parent a99cd20 commit e75f56d

File tree

2 files changed

+104
-16
lines changed

2 files changed

+104
-16
lines changed

packages/netglade_utils/lib/src/result/option.dart

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
1-
typedef NoneCallback<TResult> = TResult? Function();
2-
typedef SomeCallback<TResult, T> = TResult? Function(Some<T> value);
1+
typedef NoneCallback<TResult> = TResult Function();
2+
typedef SomeCallback<TResult, T> = TResult Function(Some<T> value);
3+
4+
typedef NullableNoneCallback<TResult> = TResult? Function();
5+
typedef NullableSomeCallback<TResult, T> = TResult? Function(Some<T> value);
6+
7+
typedef ValueNoneCallback<TResult> = TResult Function();
8+
typedef ValueSomeCallback<TResult, T> = TResult Function(T some);
39

410
/// Returns optionally given type [T] wrapped in [Some].
511
///
@@ -13,34 +19,72 @@ sealed class Option<T> {
1319
const factory Option.none() = None;
1420
const factory Option.some(T value) = Some<T>;
1521

22+
TResult map<TResult extends Object?>({
23+
required NoneCallback<TResult> none,
24+
required SomeCallback<TResult, T> some,
25+
});
26+
1627
TResult? mapOrNull<TResult extends Object?>({
17-
NoneCallback<TResult>? none,
18-
SomeCallback<TResult, T>? some,
28+
NullableNoneCallback<TResult>? none,
29+
NullableSomeCallback<TResult, T>? some,
30+
});
31+
32+
TResult when<TResult extends Object?>({
33+
required ValueNoneCallback<TResult> none,
34+
required ValueSomeCallback<TResult, T> some,
1935
});
2036
}
2137

2238
final class None<T> extends Option<T> {
2339
const None();
2440

41+
@override
42+
TResult map<TResult extends Object?>({
43+
required NoneCallback<TResult> none,
44+
required SomeCallback<TResult, T> some,
45+
}) =>
46+
none();
47+
2548
@override
2649
TResult? mapOrNull<TResult extends Object?>({
27-
NoneCallback<TResult>? none,
28-
SomeCallback<TResult, T>? some,
50+
NullableNoneCallback<TResult>? none,
51+
NullableSomeCallback<TResult, T>? some,
2952
}) =>
3053
none?.call();
54+
55+
@override
56+
TResult when<TResult extends Object?>({
57+
required ValueNoneCallback<TResult> none,
58+
required ValueSomeCallback<TResult, T> some,
59+
}) =>
60+
none();
3161
}
3262

3363
final class Some<T> extends Option<T> {
3464
final T value;
3565

3666
const Some(this.value);
3767

68+
@override
69+
TResult map<TResult extends Object?>({
70+
required NoneCallback<TResult> none,
71+
required SomeCallback<TResult, T> some,
72+
}) =>
73+
some(this);
74+
3875
@override
3976
TResult? mapOrNull<TResult extends Object?>({
40-
NoneCallback<TResult>? none,
41-
SomeCallback<TResult, T>? some,
77+
NullableNoneCallback<TResult>? none,
78+
NullableSomeCallback<TResult, T>? some,
4279
}) =>
4380
some?.call(this);
81+
82+
@override
83+
TResult when<TResult extends Object?>({
84+
required ValueNoneCallback<TResult> none,
85+
required ValueSomeCallback<TResult, T> some,
86+
}) =>
87+
some(value);
4488
}
4589

4690
extension OptionExtension<T> on Option<T> {

packages/netglade_utils/lib/src/result/result_impl.dart

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
// ignore_for_file: prefer-match-file-name
22

3-
typedef SuccessCallback<T, S, E> = T? Function(Success<S, E> value);
4-
typedef ErrorCallback<T, S, E> = T? Function(Error<S, E> value);
3+
typedef SuccessCallback<T, S, E> = T Function(Success<S, E> value);
4+
typedef ErrorCallback<T, S, E> = T Function(Error<S, E> value);
5+
6+
typedef NullableSuccessCallback<T, S, E> = T? Function(Success<S, E> value);
7+
typedef NullableErrorCallback<T, S, E> = T? Function(Error<S, E> value);
8+
9+
typedef SuccessValueCallback<T, S> = T Function(S success);
10+
typedef ErrorValueCallback<T, E> = T Function(E error);
511

612
/// Returns either Success [S] or Error [E] type.
713
sealed class Result<S, E> {
@@ -10,9 +16,19 @@ sealed class Result<S, E> {
1016
const factory Result.success(S success) = Success<S, E>;
1117
const factory Result.error(E error) = Error<S, E>;
1218

19+
TResult map<TResult extends Object?>({
20+
required SuccessCallback<TResult, S, E> success,
21+
required ErrorCallback<TResult, S, E> error,
22+
});
23+
1324
TResult? mapOrNull<TResult extends Object?>({
14-
SuccessCallback<TResult, S, E>? success,
15-
ErrorCallback<TResult, S, E>? error,
25+
NullableSuccessCallback<TResult, S, E> success,
26+
NullableErrorCallback<TResult, S, E> error,
27+
});
28+
29+
TResult when<TResult extends Object?>({
30+
required SuccessValueCallback<TResult, S> success,
31+
required ErrorValueCallback<TResult, E> error,
1632
});
1733
}
1834

@@ -21,25 +37,53 @@ final class Success<S, E> extends Result<S, E> {
2137

2238
const Success(this.success);
2339

40+
@override
41+
TResult map<TResult extends Object?>({
42+
required SuccessCallback<TResult, S, E> success,
43+
required ErrorCallback<TResult, S, E> error,
44+
}) =>
45+
success(this);
46+
2447
@override
2548
TResult? mapOrNull<TResult extends Object?>({
26-
SuccessCallback<TResult, S, E>? success,
27-
ErrorCallback<TResult, S, E>? error,
49+
NullableSuccessCallback<TResult, S, E>? success,
50+
NullableErrorCallback<TResult, S, E>? error,
2851
}) =>
2952
success?.call(this);
53+
54+
@override
55+
TResult when<TResult extends Object?>({
56+
required SuccessValueCallback<TResult, S> success,
57+
required ErrorValueCallback<TResult, E> error,
58+
}) =>
59+
success(this.success);
3060
}
3161

3262
final class Error<S, E> extends Result<S, E> {
3363
final E error;
3464

3565
const Error(this.error);
3666

67+
@override
68+
TResult map<TResult extends Object?>({
69+
required SuccessCallback<TResult, S, E> success,
70+
required ErrorCallback<TResult, S, E> error,
71+
}) =>
72+
error(this);
73+
3774
@override
3875
TResult? mapOrNull<TResult extends Object?>({
39-
SuccessCallback<TResult, S, E>? success,
40-
ErrorCallback<TResult, S, E>? error,
76+
NullableSuccessCallback<TResult, S, E>? success,
77+
NullableErrorCallback<TResult, S, E>? error,
4178
}) =>
4279
error?.call(this);
80+
81+
@override
82+
TResult when<TResult extends Object?>({
83+
required SuccessValueCallback<TResult, S> success,
84+
required ErrorValueCallback<TResult, E> error,
85+
}) =>
86+
error(this.error);
4387
}
4488

4589
extension ResultExtension<S, E> on Result<S, E> {

0 commit comments

Comments
 (0)