Skip to content

Instantly share code, notes, and snippets.

@lucasteles
Created October 7, 2022 18:59
Show Gist options
  • Save lucasteles/5c7a9b0b472139f95876230b0ff4fbe2 to your computer and use it in GitHub Desktop.
Save lucasteles/5c7a9b0b472139f95876230b0ff4fbe2 to your computer and use it in GitHub Desktop.
Result C# 2022
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