stagePlanner.go
func findTypeChecks(symbol OperatorSymbol) typeChecks {

	switch symbol {
	case GT:
		fallthrough
	case LT:
		fallthrough
	case GTE:
		fallthrough
	case LTE:
		return typeChecks{
			combined: comparatorTypeCheck,
		}
	case REQ:
		fallthrough
	case NREQ:
		return typeChecks{
			left:  isString,
			right: isRegexOrString,
		}
	case AND:
		fallthrough
	case OR:
		return typeChecks{
			left:  isBool,
			right: isBool,
		}
	case IN:
		return typeChecks{
			right: isArray,
		}
	case BITWISE_LSHIFT:
		fallthrough
	case BITWISE_RSHIFT:
		fallthrough
	case BITWISE_OR:
		fallthrough
	case BITWISE_AND:
		fallthrough
	case BITWISE_XOR:
		return typeChecks{
			left:  isFloat64,
			right: isFloat64,
		}
	case PLUS:
		return typeChecks{
			combined: additionTypeCheck,
		}
	case MINUS:
		fallthrough
	case MULTIPLY:
		fallthrough
	case DIVIDE:
		fallthrough
	case MODULUS:
		fallthrough
	case EXPONENT:
		return typeChecks{
			left:  isFloat64,
			right: isFloat64,
		}
	case NEGATE:
		return typeChecks{
			right: isFloat64,
		}
	case INVERT:
		return typeChecks{
			right: isBool,
		}
	case BITWISE_NOT:
		return typeChecks{
			right: isFloat64,
		}
	case TERNARY_TRUE:
		return typeChecks{
			left: isBool,
		}

	// unchecked cases
	case EQ:
		fallthrough
	case NEQ:
		return typeChecks{}
	case TERNARY_FALSE:
		fallthrough
	case COALESCE:
		fallthrough
	default:
		return typeChecks{}
	}
}
func findTypeChecks(symbol OperatorSymbol) typeChecks {

	switch symbol {
	case GT:
		fallthrough
	case LT:
		fallthrough
	case GTE:
		fallthrough
	case LTE:
		return typeChecks{
			combined: comparatorTypeCheck,
		}
	case REQ:
		fallthrough
	case NREQ:
		return typeChecks{
			left:  isString,
			right: isRegexOrString,
		}
	case AND:
		fallthrough
	case OR:
		return typeChecks{
			left:  isBool,
			right: isBool,
		}
	case IN:
		return typeChecks{
			right: isArray,
		}
	case BITWISE_LSHIFT:
		fallthrough
	case BITWISE_RSHIFT:
		fallthrough
	case BITWISE_OR:
		fallthrough
	case BITWISE_AND:
		fallthrough
	case BITWISE_XOR:
		return typeChecks{
			left:  isFloat64,
			right: isFloat64,
		}
	case PLUS:
		return typeChecks{
			combined: additionTypeCheck,
		}
	case MINUS:
		fallthrough
	case MULTIPLY:
		fallthrough
	case DIVIDE:
		fallthrough
	case MODULUS:
		fallthrough
	case EXPONENT:
		return typeChecks{
			left:  isFloat64,
			right: isFloat64,
		}
	case NEGATE:
		return typeChecks{
			right: isFloat64,
		}
	case INVERT:
		return typeChecks{
			right: isBool,
		}
	case BITWISE_NOT:
		return typeChecks{
			right: isFloat64,
		}
	case TERNARY_TRUE:
		return typeChecks{
			left: isBool,
		}

	// unchecked cases
	case EQ:
		fallthrough
	case NEQ:
		return typeChecks{}
	case TERNARY_FALSE:
		fallthrough
	case COALESCE:
		fallthrough
	default:
		return typeChecks{}
	}
}
func findTypeChecks ( symbol OperatorSymbol ) typeChecks { switch symbol { case GT : fallthrough case LT : fallthrough case GTE : fallthrough case LTE : return typeChecks { combined : comparatorTypeCheck , } case REQ : fallthrough case NREQ : return typeChecks { left : isString , right : isRegexOrString , } case AND : fallthrough case OR : return typeChecks { left : isBool , right : isBool , } case IN : return typeChecks { right : isArray , } case BITWISE_LSHIFT : fallthrough case BITWISE_RSHIFT : fallthrough case BITWISE_OR : fallthrough case BITWISE_AND : fallthrough case BITWISE_XOR : return typeChecks { left : isFloat64 , right : isFloat64 , } case PLUS : return typeChecks { combined : additionTypeCheck , } case MINUS : fallthrough case MULTIPLY : fallthrough case DIVIDE : fallthrough case MODULUS : fallthrough case EXPONENT : return typeChecks { left : isFloat64 , right : isFloat64 , } case NEGATE : return typeChecks { right : isFloat64 , } case INVERT : return typeChecks { right : isBool , } case BITWISE_NOT : return typeChecks { right : isFloat64 , } case TERNARY_TRUE : return typeChecks { left : isBool , } // unchecked cases case EQ : fallthrough case NEQ : return typeChecks { } case TERNARY_FALSE : fallthrough case COALESCE : fallthrough default : return typeChecks { } } }
/*
	Maps a given [symbol] to a set of typechecks to be used during runtime.
*/
/ * Maps a given [ symbol ] to a set of typechecks to be used during runtime .