Created
October 7, 2022 18:59
-
-
Save lucasteles/5c7a9b0b472139f95876230b0ff4fbe2 to your computer and use it in GitHub Desktop.
Result C# 2022
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public abstract record Result<TOk, TError> | |
{ | |
public sealed record Ok(TOk Value) : Result<TOk, TError> | |
{ | |
public override TOk Default(TOk defaultValueIfError) => Value; | |
public override T Match<T>(Func<TOk, T> ok, Func<TError, T> error) => ok(Value); | |
public override Result<TMap, TError> Select<TMap>(Func<TOk, TMap> map) => map(Value); | |
public override Result<TMap, TError> Bind<TMap>(Func<TOk, Result<TMap, TError>> bind) => bind(Value); | |
public override bool IsError => false; | |
} | |
public sealed record Error(TError Err) : Result<TOk, TError> | |
{ | |
public override TOk Default(TOk defaultValueIfError) => defaultValueIfError; | |
public override T Match<T>(Func<TOk, T> ok, Func<TError, T> error) => error(Err); | |
public override Result<TMap, TError> Select<TMap>(Func<TOk, TMap> map) => Err; | |
public override Result<TMap, TError> Bind<TMap>(Func<TOk, Result<TMap, TError>> bind) => Err; | |
public override bool IsError => true; | |
} | |
public static implicit operator Result<TOk, TError>(TOk value) => new Ok(value); | |
public static implicit operator Result<TOk, TError>(TError value) => new Error(value); | |
public abstract TOk Default(TOk defaultValueIfError); | |
public abstract T Match<T>(Func<TOk, T> ok, Func<TError, T> error); | |
public abstract Result<TMap, TError> Select<TMap>(Func<TOk, TMap> map); | |
public abstract Result<TMap, TError> Bind<TMap>(Func<TOk, Result<TMap, TError>> bind); | |
public Result<TResult, TError> SelectMany<TMap, TResult>( | |
Func<TOk, Result<TMap, TError>> bind, | |
Func<TOk, TMap, TResult> project) => | |
Bind(a => bind(a).Select(b => project(a, b))); | |
public abstract bool IsError { get; } | |
public bool IsOk => !IsError; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment