Created
May 15, 2019 15:56
-
-
Save palladin/89eacfc7934a0c6cee9611bf281fe008 to your computer and use it in GitHub Desktop.
BoolExpr eval
This file contains hidden or 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 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