Skip to content

Instantly share code, notes, and snippets.

@palladin
Created May 15, 2019 15:56
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save palladin/89eacfc7934a0c6cee9611bf281fe008 to your computer and use it in GitHub Desktop.
Save palladin/89eacfc7934a0c6cee9611bf281fe008 to your computer and use it in GitHub Desktop.
BoolExpr eval
public interface IBoolExpr { }
public class And : IBoolExpr
{
public IBoolExpr Left { get; set; }
public IBoolExpr Right { get; set; }
public void Deconstruct(out IBoolExpr left, out IBoolExpr right)
{
left = Left;
right = Right;
}
}
public class Or : IBoolExpr
{
public IBoolExpr Left { get; set; }
public IBoolExpr Right { get; set; }
public void Deconstruct(out IBoolExpr left, out IBoolExpr right)
{
left = Left;
right = Right;
}
}
public class Not : IBoolExpr
{
public IBoolExpr Expr { get; set; }
public void Deconstruct(out IBoolExpr expr) => expr = Expr;
}
public class Const : IBoolExpr
{
public bool Value { get; set; }
public void Deconstruct(out bool value) => value = Value;
}
public static bool Eval(IBoolExpr expr) =>
expr switch
{
And (var left, var right) => Eval(left) && Eval(right),
Or (var left, var right) => Eval(left) || Eval(right),
Not (var _expr) => !Eval(_expr),
Const (var value) => value
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment