103 lines
4.1 KiB
Kotlin
103 lines
4.1 KiB
Kotlin
|
package net.shadowfacts.kiwidsl
|
||
|
|
||
|
import no.birkett.kiwi.*
|
||
|
|
||
|
/**
|
||
|
* @author shadowfacts
|
||
|
*/
|
||
|
class KiwiContext(val solver: Solver) {
|
||
|
val REQUIRED = Strength.REQUIRED
|
||
|
val STRONG = Strength.STRONG
|
||
|
val MEDIUM = Strength.MEDIUM
|
||
|
val WEAK = Strength.WEAK
|
||
|
|
||
|
// Constraints
|
||
|
infix fun ExpressionConvertible.equalTo(other: ExpressionConvertible): Constraint {
|
||
|
return Symbolics.equals(this.toExpression(), other.toExpression()).apply(solver::addConstraint)
|
||
|
}
|
||
|
|
||
|
fun ExpressionConvertible.equalTo(other: ExpressionConvertible, strength: Double): Constraint {
|
||
|
return Symbolics.equals(this.toExpression(), other.toExpression()).setStrength(strength).apply(solver::addConstraint)
|
||
|
}
|
||
|
|
||
|
infix fun ExpressionConvertible.equalTo(constant: Number): Constraint {
|
||
|
return Symbolics.equals(this.toExpression(), constant.toDouble()).apply(solver::addConstraint)
|
||
|
}
|
||
|
|
||
|
fun ExpressionConvertible.equalTo(constant: Number, strength: Double): Constraint {
|
||
|
return Symbolics.equals(this.toExpression(), constant.toDouble()).setStrength(strength).apply(solver::addConstraint)
|
||
|
}
|
||
|
|
||
|
infix fun ExpressionConvertible.lessThanOrEqualTo(other: ExpressionConvertible): Constraint {
|
||
|
return Symbolics.lessThanOrEqualTo(this.toExpression(), other.toExpression()).apply(solver::addConstraint)
|
||
|
}
|
||
|
|
||
|
fun ExpressionConvertible.lessThanOrEqualTo(other: ExpressionConvertible, strength: Double): Constraint {
|
||
|
return Symbolics.lessThanOrEqualTo(this.toExpression(), other.toExpression()).setStrength(strength).apply(solver::addConstraint)
|
||
|
}
|
||
|
|
||
|
infix fun ExpressionConvertible.lessThanOrEqualTo(constant: Number): Constraint {
|
||
|
return Symbolics.lessThanOrEqualTo(this.toExpression(), constant.toDouble()).apply(solver::addConstraint)
|
||
|
}
|
||
|
|
||
|
fun ExpressionConvertible.lessThanOrEqualTo(constant: Number, strength: Double): Constraint {
|
||
|
return Symbolics.lessThanOrEqualTo(this.toExpression(), constant.toDouble()).setStrength(strength).apply(solver::addConstraint)
|
||
|
}
|
||
|
|
||
|
infix fun ExpressionConvertible.greaterThanOrEqualTo(other: ExpressionConvertible): Constraint {
|
||
|
return Symbolics.greaterThanOrEqualTo(this.toExpression(), other.toExpression()).apply(solver::addConstraint)
|
||
|
}
|
||
|
|
||
|
fun ExpressionConvertible.greaterThanOrEqualTo(other: ExpressionConvertible, strength: Double): Constraint {
|
||
|
return Symbolics.greaterThanOrEqualTo(this.toExpression(), other.toExpression()).setStrength(strength).apply(solver::addConstraint)
|
||
|
}
|
||
|
|
||
|
infix fun ExpressionConvertible.greaterThanOrEqualTo(constant: Number): Constraint {
|
||
|
return Symbolics.greaterThanOrEqualTo(this.toExpression(), constant.toDouble()).apply(solver::addConstraint)
|
||
|
}
|
||
|
|
||
|
fun ExpressionConvertible.greaterThanOrEqualTo(constant: Number, strength: Double): Constraint {
|
||
|
return Symbolics.greaterThanOrEqualTo(this.toExpression(), constant.toDouble()).setStrength(strength).apply(solver::addConstraint)
|
||
|
}
|
||
|
|
||
|
// Addition
|
||
|
operator fun ExpressionConvertible.plus(other: ExpressionConvertible): Expression {
|
||
|
return Symbolics.add(this.toExpression(), other.toExpression())
|
||
|
}
|
||
|
|
||
|
operator fun ExpressionConvertible.plus(constant: Number): Expression {
|
||
|
return Symbolics.add(this.toExpression(), constant.toDouble())
|
||
|
}
|
||
|
|
||
|
// Subtraction
|
||
|
operator fun ExpressionConvertible.minus(other: ExpressionConvertible): Expression {
|
||
|
return Symbolics.subtract(this.toExpression(), other.toExpression())
|
||
|
}
|
||
|
|
||
|
operator fun ExpressionConvertible.minus(constant: Number): Expression {
|
||
|
return Symbolics.subtract(this.toExpression(), constant.toDouble())
|
||
|
}
|
||
|
|
||
|
// Multiplication
|
||
|
operator fun ExpressionConvertible.times(other: ExpressionConvertible): Expression {
|
||
|
return Symbolics.multiply(this.toExpression(), other.toExpression())
|
||
|
}
|
||
|
|
||
|
operator fun ExpressionConvertible.times(constant: Number): Expression {
|
||
|
return Symbolics.multiply(this.toExpression(), constant.toDouble())
|
||
|
}
|
||
|
|
||
|
// Division
|
||
|
operator fun ExpressionConvertible.div(other: ExpressionConvertible): Expression {
|
||
|
return Symbolics.divide(this.toExpression(), other.toExpression())
|
||
|
}
|
||
|
|
||
|
operator fun ExpressionConvertible.div(constant: Number): Expression {
|
||
|
return Symbolics.divide(this.toExpression(), constant.toDouble())
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fun Solver.dsl(init: KiwiContext.() -> Unit): Solver {
|
||
|
KiwiContext(this).init()
|
||
|
return this
|
||
|
}
|