Skip to content

Instantly share code, notes, and snippets.

View davidelettieri's full-sized avatar

Davide Lettieri davidelettieri

View GitHub Profile
Union<Customer,Failure> ValidateEmail(Customer c) {
if(c.Email is null)
return new Failure("Email is not valid");
return c;
}
Union<Customer,Failure> ValidateNameSurname(Customer c) {
if(c.Name is null)
return new Failure("Name is not valid");
@davidelettieri
davidelettieri / wf-visitor-pattern.cs
Created February 21, 2021 09:59
Sample code for workflows with visitor pattern
public class Claim
{
public Workflow Workflow { get; }
}
public abstract class Workflow
{
public abstract void Fire(Transition transition, Claim claim);
}
public class FullWF : Workflow
class VisitorImpl : PolynomialBaseVisitor<INode>
{
public override INode VisitPlusminus([NotNull] PolynomialParser.PlusminusContext context)
{
var left = context.expr()[0];
var right = context.expr()[1];
if (context.MINUS() != null)
return new SubtractNode(Visit(left), Visit(right));
public interface INode
{
double Eval(Dictionary<char, double> variablesValue);
}
public class AddNode : INode
{
private readonly INode _left;
private readonly INode _right;
public static Func<T, Result<S, TError>> ToSwitchFunction<T, S, TError>(Func<T, S> a)
{
return t =>
{
return a(t);
};
}
public static Func<T, Result<T, TError>> ToSwitchFunction<T, TError>(Action<T> a)
{
bool ValidateEmail(Customer c) { /**/ }
bool ValidateNameSurname(Customer c) { /**/ }
bool SendEmail(Customer c) { /**/ }
bool SendEmailToCustomerIfValid(Customer c) {
if(!ValidateNameSurname(c))
return false;
if(!ValidateEmail(c))
return false;
public static Func<T, T> ToFunc<T>(Action<T> a)
{
return t =>
{
a(t);
return t;
};
}
public static Result<S, TError> Then<S, TValue, TError>(this Result<TValue, TError> r, Func<TValue, Result<S, TError>> f)
=> Bind(f)(r);
public static Func<Result<TSuccess, TError>, Result<TSuccess, TError>> Bind<TSuccess, TError>(Func<TSuccess, Result<TSuccess, TError>> f)
{
return r => r.Match(t => f(t), e => new Result<TSuccess, TError>(e));
}
Union<Success,Failure> ValidateEmail(Customer c) { ... }
public class Success {}
public class Failure {
public string Message {get;}
public Failure(string message) {
Message = message;
}