functions.ts 846 B

12345678910111213141516171819202122232425262728293031
  1. import {assertNever} from "../utils";
  2. import {Expression} from "./types";
  3. export function evaluate(expr: Expression): number {
  4. switch (expr.type) {
  5. case "literal": {
  6. return expr.value;
  7. }
  8. case "binary": {
  9. switch (expr.operator) {
  10. case "+":
  11. return evaluate(expr.left) + evaluate(expr.right);
  12. case "-":
  13. return evaluate(expr.left) - evaluate(expr.right);
  14. case "*":
  15. return evaluate(expr.left) * evaluate(expr.right);
  16. case "/":
  17. return evaluate(expr.left) / evaluate(expr.right);
  18. /* istanbul ignore next */
  19. default: {
  20. return assertNever("Unexpected binary operator", expr.operator);
  21. }
  22. }
  23. }
  24. /* istanbul ignore next */
  25. default: {
  26. return assertNever("Unexpected expression type", expr);
  27. }
  28. }
  29. }