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 Error(E error) { return new ErrorResult(error); } public static OkResult Ok(T value) { return new OkResult(value); } public static Result Flatten(this Result, E> result) { if(result.Get(out var inner, out var error)) { return inner; } else { return Result.Error(error); } } public static Result Flatten(this Result, E> result) { if(result.Get(out var inner, out var error)) { return inner; } else { return Result.Error(error); } } } public class OkResult { } public class OkResult { public T Value; public OkResult(T value) { Value = value; } } public class ErrorResult { public E Error; public ErrorResult(E error) { Error = error; } } public class Result { 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(OkResult r) { return new Result(); } public static implicit operator Result(ErrorResult r) { return new Result(r.Error); } public bool Get([NotNullWhen(false)][MaybeNull] out E error) { error = _error; return _status == Status.Ok; } public Result MapOk(Func mapFunc) { if(_status == Status.Ok) { return Result.Ok(mapFunc()); } else { return Result.Error(_error); } } public Result MapOk(Action mapFunc) { if(_status == Status.Ok) { mapFunc(); return Result.Ok(); } else { return Result.Error(_error); } } } public class Result { 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(OkResult r) { return new Result(r.Value); } public static implicit operator Result(ErrorResult r) { return new Result(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 bool GetOk([NotNullWhen(true)][MaybeNull] out T value) { value = _value; return _status == Status.Ok; } public Result MapOk(Func mapFunc) { if(_status == Status.Ok) { return Result.Ok(mapFunc(_value)); } else { return Result.Error(_error); } } } }