Skip to content

Instantly share code, notes, and snippets.

View RotBolt's full-sized avatar
Plus Ultra

Rohan Maity RotBolt

Plus Ultra
View GitHub Profile
@RotBolt
RotBolt / kotlin_extension_function_solving_expression_problem.kt
Created November 27, 2022 17:01
kotlin extension function solving expression problem
// Initially I have an interface Expr (just like in Java) and have two classes (Constant and BinaryPlus) implement that interface
interface Exp {
fun eval(): Double
}
class Constant(val value:Double): Exp {
override fun eval(): Double = value
}
#!modulesToBuild=extensions/webjars-locator/deployment,extensions/logging-json/deployment,extensions/smallrye-opentracing/deployment,extensions/smallrye-reactive-messaging/deployment,extensions/vertx/deployment,extensions/spring-data-jpa/deployment,extensions/spring-di/deployment,extensions/spring-web/deployment,extensions/spring-boot-properties/deployment,extensions/spring-security/deployment,extensions/reactive-streams-operators/smallrye-reactive-streams-operators/deployment,extensions/smallrye-reactive-messaging-amqp/deployment,extensions/smallrye-reactive-messaging-amqp/runtime,extensions/smallrye-reactive-messaging-kafka/deployment,extensions/smallrye-openapi/deployment,extensions/smallrye-jwt/deployment,extensions/smallrye-fault-tolerance/deployment,extensions/smallrye-context-propagation/deployment,extensions/rest-client/deployment,extensions/scheduler/deployment,extensions/oidc/deployment,extensions/quartz/deployment,extensions/reactive-pg-client/deployment,extensions/keycloak-authorization/deployment
PncBuild pncBuild = getBuild(generationData.getSourceBuild());
ArtifactWrapper bomArtifact = pncBuild.findArtifactByFileName(generationData.getSourceArtifact());
String bomConstraintVersion = bomArtifact.toGAV().getVersion();
#!modulesToBuild=extensions/webjars-locator/deployment,extensions/logging-json/deployment,extensions/smallrye-opentracing/deployment,extensions/smallrye-reactive-messaging/deployment,extensions/vertx/deployment,extensions/spring-data-jpa/deployment,extensions/spring-di/deployment,extensions/spring-web/deployment,extensions/spring-boot-properties/deployment,extensions/spring-security/deployment,extensions/reactive-streams-operators/smallrye-reactive-streams-operators/deployment,extensions/smallrye-reactive-messaging-amqp/deployment,extensions/smallrye-reactive-messaging-amqp/runtime,extensions/smallrye-reactive-messaging-kafka/deployment,extensions/smallrye-openapi/deployment,extensions/smallrye-jwt/deployment,extensions/smallrye-fault-tolerance/deployment,extensions/smallrye-context-propagation/deployment,extensions/rest-client/deployment,extensions/scheduler/deployment,extensions/oidc/deployment,extensions/quartz/deployment,extensions/reactive-pg-client/deployment,extensions/keycloak-authorization/deployment
private fun extractNumber(numString: String) = numString.toDoubleOrNull()
private fun isValue(expression: String): Boolean {
val validChars = "1234567890.-"
for (i in expression.indices) {
val char = expression[i]
if (char !in validChars) return false
if (expression.count { it == '.' } > 1) return false
// Checking for function in expression
val position = expression.indexOf('(')
if (position > 0 && expression.last() == ')'){
val funString = expression.substring(0,position)
val value= evaluate(expression.substring(position+1,expression.lastIndex))
val res = evaluateFunction(funString, value)
return res
}
for (operator in Operators.values()) {
var position = expression.reversed().lastIndexOf(operator.sign)
while (position > 0) {
if (isOperator(operator, expression, position)) {
...
...
}
// check again for same operator till the previous position
if (position > 0) {
private fun isOperator(operator: Operators, expression: String, position: Int): Boolean {
if (operator == Operators.PLUS) {
// Check the previous operator
if (expression[position - 1] == 'E') {
if (position >= 2) {
return false
}
} else {
return true
}
private fun String.lastIndexOf(char: Char): Int {
var bOpen = 0 // count for open bracket
var bClose = 0 // count for close bracket
for (i in this.indices) {
val currChar = this[i]
when {
currChar == char && bOpen == bClose ->
return this.length - i - 1
currChar == '(' -> bOpen++
// evaluate function
private fun evaluate(expression: String): Double? {
for (operator in Operators.values()) {
/*
reversed() : find the operator from right side (last)
for cases : 20/10/2, 12-4-4
*/
var position = expression.reversed().lastIndexOf(operator.sign)
if(position>0){
val partialExpressions = expression.split(position)