Skip to content

Instantly share code, notes, and snippets.

@rubberduck203
Last active August 6, 2017 03:22
Show Gist options
  • Save rubberduck203/d2455148b75b5a795e9bebcf74a3ce51 to your computer and use it in GitHub Desktop.
Save rubberduck203/d2455148b75b5a795e9bebcf74a3ce51 to your computer and use it in GitHub Desktop.
Putzing with monads
public class Class1
{
[Fact]
public void applesauce()
{
Result<int> result =
new Success<int>(32)
.Bind(i => new Success<int>(i + 1));
result.OnSuccess(Console.WriteLine);
Result<int> fail = new Failure<int>("boom!")
.Bind(i => new Success<int>(i + 22));
fail.OnSuccess(_ => Console.WriteLine("Shouldn't run."));
fail.OnFailure(Console.WriteLine);
}
}
public static class ResultExtensions
{
public static Result<T> Bind<T>(this Result<T> result, Func<T, Result<T>> f)
{
switch (result)
{
case Failure<T> failure:
return new Failure<T>(failure.Message);
case Success<T> success:
return f(success.Value);
default:
throw new ArgumentException("Wat?");
}
}
public static void OnSuccess<T>(this Result<T> result, Action<Success<T>> f)
{
if (result is Success<T> success)
{
f(success);
}
}
public static void OnFailure<T>(this Result<T> result, Action<Failure<T>> f)
{
if (result is Failure<T> failure)
{
f(failure);
}
}
}
public interface Result<T>
{
}
public class Success<T> : Result<T>
{
public T Value { get; }
public Success(T value)
{
Value = value;
}
public override string ToString()
{
return $"Success[{Value}]";
}
}
public class Failure<T> : Result<T>
{
public string Message { get; }
public Failure(string message)
{
Message = message;
}
public override string ToString()
{
return $"Failure[{Message}]";
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment