|
@@ -7,6 +7,15 @@ namespace InABox.Core
|
|
|
{
|
|
|
public static class Result
|
|
|
{
|
|
|
+ public static Result<E> Ok<E>()
|
|
|
+ {
|
|
|
+ return new Result<E>();
|
|
|
+ }
|
|
|
+ public static Result<E> Error<E>(E error)
|
|
|
+ {
|
|
|
+ return new Result<E>(error);
|
|
|
+ }
|
|
|
+
|
|
|
public static Result<T, E> Ok<T, E>(T value)
|
|
|
{
|
|
|
return new Result<T, E>(value);
|
|
@@ -15,6 +24,82 @@ namespace InABox.Core
|
|
|
{
|
|
|
return new Result<T, E>(error);
|
|
|
}
|
|
|
+
|
|
|
+ public static Result<E> Flatten<E>(this Result<Result<E>, E> result)
|
|
|
+ {
|
|
|
+ if(result.Get(out var inner, out var error))
|
|
|
+ {
|
|
|
+ return inner;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return Result.Error(error);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ public static Result<T, E> Flatten<T, E>(this Result<Result<T, E>, E> result)
|
|
|
+ {
|
|
|
+ if(result.Get(out var inner, out var error))
|
|
|
+ {
|
|
|
+ return inner;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return Result.Error<T, E>(error);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public class Result<E>
|
|
|
+ {
|
|
|
+ public enum Status
|
|
|
+ {
|
|
|
+ Ok,
|
|
|
+ Error
|
|
|
+ }
|
|
|
+
|
|
|
+ private E _error;
|
|
|
+ private Status _status;
|
|
|
+
|
|
|
+ public Result()
|
|
|
+ {
|
|
|
+ _status = Status.Ok;
|
|
|
+ }
|
|
|
+ public Result(E error)
|
|
|
+ {
|
|
|
+ _error = error;
|
|
|
+ _status = Status.Error;
|
|
|
+ }
|
|
|
+
|
|
|
+ public bool Get([NotNullWhen(false)][MaybeNull] out E error)
|
|
|
+ {
|
|
|
+ error = _error;
|
|
|
+ return _status == Status.Ok;
|
|
|
+ }
|
|
|
+
|
|
|
+ public Result<U, E> MapOk<U>(Func<U> mapFunc)
|
|
|
+ {
|
|
|
+ if(_status == Status.Ok)
|
|
|
+ {
|
|
|
+ return Result.Ok<U, E>(mapFunc());
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return Result.Error<U, E>(_error);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public Result<E> MapOk(Action mapFunc)
|
|
|
+ {
|
|
|
+ if(_status == Status.Ok)
|
|
|
+ {
|
|
|
+ mapFunc();
|
|
|
+ return Result.Ok<E>();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return Result.Error<E>(_error);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
public class Result<T, E>
|
|
@@ -48,5 +133,17 @@ namespace InABox.Core
|
|
|
error = _error;
|
|
|
return _status == Status.Ok;
|
|
|
}
|
|
|
+
|
|
|
+ public Result<U, E> MapOk<U>(Func<T, U> mapFunc)
|
|
|
+ {
|
|
|
+ if(_status == Status.Ok)
|
|
|
+ {
|
|
|
+ return Result.Ok<U, E>(mapFunc(_value));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return Result.Error<U, E>(_error);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|