123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- using System;
- using System.Collections.Generic;
- using System.Diagnostics.CodeAnalysis;
- using System.Text;
- namespace InABox.Core
- {
- public static class Result
- {
- public static OkResult Ok()
- {
- return new OkResult();
- }
- public static ErrorResult<E> Error<E>(E error)
- {
- return new ErrorResult<E>(error);
- }
- public static OkResult<T> Ok<T>(T value)
- {
- return new OkResult<T>(value);
- }
- 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(error);
- }
- }
- }
- public class OkResult
- {
- }
- public class OkResult<T>
- {
- public T Value;
- public OkResult(T value)
- {
- Value = value;
- }
- }
- public class ErrorResult<E>
- {
- public E Error;
- public ErrorResult(E error)
- {
- Error = error;
- }
- }
- public class Result<E>
- {
- public enum Status
- {
- Ok,
- Error
- }
- private E _error;
- private Status _status;
- public Result()
- {
- _error = default;
- _status = Status.Ok;
- }
- public Result(E error)
- {
- _error = error;
- _status = Status.Error;
- }
- public static implicit operator Result<E>(OkResult r)
- {
- return new Result<E>();
- }
- public static implicit operator Result<E>(ErrorResult<E> r)
- {
- return new Result<E>(r.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(mapFunc());
- }
- else
- {
- return Result.Error(_error);
- }
- }
- public Result<E> MapOk(Action mapFunc)
- {
- if(_status == Status.Ok)
- {
- mapFunc();
- return Result.Ok();
- }
- else
- {
- return Result.Error(_error);
- }
- }
- }
- public class Result<T, E>
- {
- public enum Status
- {
- Ok,
- Error
- }
- private T _value;
- private E _error;
- private Status _status;
- public bool IsOK => _status == Status.Ok;
- public Result(T value)
- {
- _value = value;
- _error = default;
- _status = Status.Ok;
- }
- public Result(E error)
- {
- _value = default;
- _error = error;
- _status = Status.Error;
- }
- public static implicit operator Result<T, E>(OkResult<T> r)
- {
- return new Result<T, E>(r.Value);
- }
- public static implicit operator Result<T, E>(ErrorResult<E> r)
- {
- return new Result<T, E>(r.Error);
- }
- public bool Get([NotNullWhen(true)][MaybeNull] out T value, [NotNullWhen(false)][MaybeNull] out E error)
- {
- value = _value;
- error = _error;
- return _status == Status.Ok;
- }
- public Result<U, E> MapOk<U>(Func<T, U> mapFunc)
- {
- if(_status == Status.Ok)
- {
- return Result.Ok(mapFunc(_value));
- }
- else
- {
- return Result.Error(_error);
- }
- }
- }
- }
|