diff --git a/core/src/main/java/org/nwapw/abacus/lexing/pattern/Transformation.java b/core/src/main/java/org/nwapw/abacus/lexing/pattern/Transformation.java index 5bab0e8..4758f54 100644 --- a/core/src/main/java/org/nwapw/abacus/lexing/pattern/Transformation.java +++ b/core/src/main/java/org/nwapw/abacus/lexing/pattern/Transformation.java @@ -13,4 +13,4 @@ public interface Transformation { */ PatternChain transform(PatternChain from); -} +} \ No newline at end of file diff --git a/core/src/main/java/org/nwapw/abacus/plugin/NumberImplementation.java b/core/src/main/java/org/nwapw/abacus/plugin/NumberImplementation.java index ad5d1d1..623a2c9 100644 --- a/core/src/main/java/org/nwapw/abacus/plugin/NumberImplementation.java +++ b/core/src/main/java/org/nwapw/abacus/plugin/NumberImplementation.java @@ -1,10 +1,10 @@ package org.nwapw.abacus.plugin; import org.nwapw.abacus.number.NumberInterface; +import org.nwapw.abacus.number.promotion.PromotionFunction; import java.util.HashMap; import java.util.Map; -import java.util.function.Function; /** * A class that holds data about a number implementation. @@ -14,7 +14,7 @@ public abstract class NumberImplementation { /** * The list of paths through which this implementation can be promoted. */ - private Map> promotionPaths; + private Map promotionPaths; /** * The implementation class for this implementation. */ @@ -41,7 +41,7 @@ public abstract class NumberImplementation { * * @return the map of documentation paths. */ - public final Map> getPromotionPaths() { + public final Map getPromotionPaths() { return promotionPaths; } diff --git a/core/src/main/kotlin/org/nwapw/abacus/number/promotion/NumberUtils.kt b/core/src/main/kotlin/org/nwapw/abacus/number/promotion/NumberUtils.kt index 4d765c5..7054994 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/number/promotion/NumberUtils.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/number/promotion/NumberUtils.kt @@ -3,7 +3,6 @@ package org.nwapw.abacus.number.promotion import org.nwapw.abacus.number.NumberInterface -typealias PromotionFunction = java.util.function.Function typealias PromotionPath = List typealias NumberClass = Class @@ -14,5 +13,5 @@ typealias NumberClass = Class * @param from the number to start from. */ fun PromotionPath.promote(from: NumberInterface): NumberInterface { - return fold(from, { current, function -> function.apply(current) }) + return fold(from, { current, function -> function.promote(current) }) } \ No newline at end of file diff --git a/core/src/main/kotlin/org/nwapw/abacus/number/promotion/PromotionFunction.kt b/core/src/main/kotlin/org/nwapw/abacus/number/promotion/PromotionFunction.kt new file mode 100644 index 0000000..4242fe2 --- /dev/null +++ b/core/src/main/kotlin/org/nwapw/abacus/number/promotion/PromotionFunction.kt @@ -0,0 +1,20 @@ +package org.nwapw.abacus.number.promotion + +import org.nwapw.abacus.number.NumberInterface + +/** + * Function that is used to promote a number from one type to another. + * + * A promotion function is used in the promotion system as a mean to + * actually "travel" down the promotion path. + */ +interface PromotionFunction { + + /** + * Promotes the given [number] into another type. + * @param number the number to promote from. + * @return the new number with the same value. + */ + fun promote(number: NumberInterface): NumberInterface + +} diff --git a/core/src/main/kotlin/org/nwapw/abacus/number/promotion/PromotionManager.kt b/core/src/main/kotlin/org/nwapw/abacus/number/promotion/PromotionManager.kt index fd7004b..c6318d8 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/number/promotion/PromotionManager.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/number/promotion/PromotionManager.kt @@ -6,7 +6,6 @@ import org.nwapw.abacus.number.NumberInterface import org.nwapw.abacus.plugin.NumberImplementation import org.nwapw.abacus.plugin.PluginListener import org.nwapw.abacus.plugin.PluginManager -import java.util.function.Function /** * A class that handles promotions based on priority and the @@ -32,7 +31,11 @@ class PromotionManager(val abacus: Abacus) : PluginListener { val fromName = abacus.pluginManager.interfaceImplementationNameFor(from.implementation) val toName = abacus.pluginManager.interfaceImplementationNameFor(to.implementation) - if(fromName == toName) return listOf(Function { it }) + if(fromName == toName) return listOf(object : PromotionFunction { + override fun promote(number: NumberInterface): NumberInterface { + return number + } + }) if(from.promotionPaths.containsKey(toName)) return listOf(from.promotionPaths[toName] ?: return null) diff --git a/core/src/test/java/org/nwapw/abacus/tests/RangeTests.java b/core/src/test/java/org/nwapw/abacus/tests/RangeTests.java index 9b87ef3..7f07b67 100644 --- a/core/src/test/java/org/nwapw/abacus/tests/RangeTests.java +++ b/core/src/test/java/org/nwapw/abacus/tests/RangeTests.java @@ -5,19 +5,17 @@ import org.junit.BeforeClass; import org.junit.Test; import org.nwapw.abacus.Abacus; import org.nwapw.abacus.config.Configuration; +import org.nwapw.abacus.number.promotion.PromotionFunction; import org.nwapw.abacus.number.standard.NaiveNumber; -import org.nwapw.abacus.number.NumberInterface; import org.nwapw.abacus.number.range.NumberRange; import org.nwapw.abacus.number.standard.PreciseNumber; import org.nwapw.abacus.plugin.standard.StandardPlugin; -import java.util.function.Function; - public class RangeTests { private static Abacus abacus = new Abacus(new Configuration( "precise", new String[]{})); - private static Function naivePromotion = i -> new NaiveNumber((i.toString())); - private static Function precisePromotion = i -> new PreciseNumber((i.toString())); + private static PromotionFunction naivePromotion = i -> new NaiveNumber((i.toString())); + private static PromotionFunction precisePromotion = i -> new PreciseNumber((i.toString())); @BeforeClass public static void prepareTests() {