mirror of
https://github.com/DanilaFe/abacus
synced 2024-12-22 07:20:09 -08:00
Merge pull request #42 from DanilaFe/java8-subset
Restrict Abacus core to a Java8 subset
This commit is contained in:
commit
5a1fdfe4bc
|
@ -6,7 +6,6 @@ import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Stack;
|
import java.util.Stack;
|
||||||
import java.util.function.Function;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A pattern that can be compiled from a string and used in lexing.
|
* A pattern that can be compiled from a string and used in lexing.
|
||||||
|
@ -36,8 +35,8 @@ public class Pattern<T> {
|
||||||
* A map of regex operator to functions that modify a PatternChain
|
* A map of regex operator to functions that modify a PatternChain
|
||||||
* with the appropriate operation.
|
* with the appropriate operation.
|
||||||
*/
|
*/
|
||||||
private Map<Character, Function<PatternChain<T>, PatternChain<T>>> operations =
|
private Map<Character, Transformation<T>> operations =
|
||||||
new HashMap<Character, Function<PatternChain<T>, PatternChain<T>>>() {{
|
new HashMap<Character, Transformation<T>>() {{
|
||||||
put('+', Pattern.this::transformPlus);
|
put('+', Pattern.this::transformPlus);
|
||||||
put('*', Pattern.this::transformStar);
|
put('*', Pattern.this::transformStar);
|
||||||
put('?', Pattern.this::transformQuestion);
|
put('?', Pattern.this::transformQuestion);
|
||||||
|
@ -207,7 +206,7 @@ public class Pattern<T> {
|
||||||
if (operations.containsKey(currentChar)) {
|
if (operations.containsKey(currentChar)) {
|
||||||
if (currentChain == null) return null;
|
if (currentChain == null) return null;
|
||||||
|
|
||||||
currentChain = operations.get(currentChar).apply(currentChain);
|
currentChain = operations.get(currentChar).transform(currentChain);
|
||||||
fullChain.append(currentChain);
|
fullChain.append(currentChain);
|
||||||
currentChain = null;
|
currentChain = null;
|
||||||
index++;
|
index++;
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
package org.nwapw.abacus.lexing.pattern;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An interface that transforms a pattern chain into a different pattern chain.
|
||||||
|
* @param <T> the type used to identify the nodes in the pattern chain.
|
||||||
|
*/
|
||||||
|
public interface Transformation<T> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Performs the actual transformation.
|
||||||
|
* @param from the original chain.
|
||||||
|
* @return the resulting chain.
|
||||||
|
*/
|
||||||
|
PatternChain<T> transform(PatternChain<T> from);
|
||||||
|
|
||||||
|
}
|
|
@ -1,10 +1,10 @@
|
||||||
package org.nwapw.abacus.plugin;
|
package org.nwapw.abacus.plugin;
|
||||||
|
|
||||||
import org.nwapw.abacus.number.NumberInterface;
|
import org.nwapw.abacus.number.NumberInterface;
|
||||||
|
import org.nwapw.abacus.number.promotion.PromotionFunction;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.function.Function;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A class that holds data about a number implementation.
|
* 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.
|
* The list of paths through which this implementation can be promoted.
|
||||||
*/
|
*/
|
||||||
private Map<String, Function<NumberInterface, NumberInterface>> promotionPaths;
|
private Map<String, PromotionFunction> promotionPaths;
|
||||||
/**
|
/**
|
||||||
* The implementation class for this implementation.
|
* The implementation class for this implementation.
|
||||||
*/
|
*/
|
||||||
|
@ -41,7 +41,7 @@ public abstract class NumberImplementation {
|
||||||
*
|
*
|
||||||
* @return the map of documentation paths.
|
* @return the map of documentation paths.
|
||||||
*/
|
*/
|
||||||
public final Map<String, Function<NumberInterface, NumberInterface>> getPromotionPaths() {
|
public final Map<String, PromotionFunction> getPromotionPaths() {
|
||||||
return promotionPaths;
|
return promotionPaths;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@ package org.nwapw.abacus.number.promotion
|
||||||
|
|
||||||
import org.nwapw.abacus.number.NumberInterface
|
import org.nwapw.abacus.number.NumberInterface
|
||||||
|
|
||||||
typealias PromotionFunction = java.util.function.Function<NumberInterface, NumberInterface>
|
|
||||||
typealias PromotionPath = List<PromotionFunction>
|
typealias PromotionPath = List<PromotionFunction>
|
||||||
typealias NumberClass = Class<NumberInterface>
|
typealias NumberClass = Class<NumberInterface>
|
||||||
|
|
||||||
|
@ -14,5 +13,5 @@ typealias NumberClass = Class<NumberInterface>
|
||||||
* @param from the number to start from.
|
* @param from the number to start from.
|
||||||
*/
|
*/
|
||||||
fun PromotionPath.promote(from: NumberInterface): NumberInterface {
|
fun PromotionPath.promote(from: NumberInterface): NumberInterface {
|
||||||
return fold(from, { current, function -> function.apply(current) })
|
return fold(from, { current, function -> function.promote(current) })
|
||||||
}
|
}
|
|
@ -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
|
||||||
|
|
||||||
|
}
|
|
@ -6,7 +6,6 @@ import org.nwapw.abacus.number.NumberInterface
|
||||||
import org.nwapw.abacus.plugin.NumberImplementation
|
import org.nwapw.abacus.plugin.NumberImplementation
|
||||||
import org.nwapw.abacus.plugin.PluginListener
|
import org.nwapw.abacus.plugin.PluginListener
|
||||||
import org.nwapw.abacus.plugin.PluginManager
|
import org.nwapw.abacus.plugin.PluginManager
|
||||||
import java.util.function.Function
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A class that handles promotions based on priority and the
|
* 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 fromName = abacus.pluginManager.interfaceImplementationNameFor(from.implementation)
|
||||||
val toName = abacus.pluginManager.interfaceImplementationNameFor(to.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))
|
if(from.promotionPaths.containsKey(toName))
|
||||||
return listOf(from.promotionPaths[toName] ?: return null)
|
return listOf(from.promotionPaths[toName] ?: return null)
|
||||||
|
|
|
@ -5,19 +5,17 @@ import org.junit.BeforeClass;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.nwapw.abacus.Abacus;
|
import org.nwapw.abacus.Abacus;
|
||||||
import org.nwapw.abacus.config.Configuration;
|
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.standard.NaiveNumber;
|
||||||
import org.nwapw.abacus.number.NumberInterface;
|
|
||||||
import org.nwapw.abacus.number.range.NumberRange;
|
import org.nwapw.abacus.number.range.NumberRange;
|
||||||
import org.nwapw.abacus.number.standard.PreciseNumber;
|
import org.nwapw.abacus.number.standard.PreciseNumber;
|
||||||
import org.nwapw.abacus.plugin.standard.StandardPlugin;
|
import org.nwapw.abacus.plugin.standard.StandardPlugin;
|
||||||
|
|
||||||
import java.util.function.Function;
|
|
||||||
|
|
||||||
public class RangeTests {
|
public class RangeTests {
|
||||||
|
|
||||||
private static Abacus abacus = new Abacus(new Configuration( "precise", new String[]{}));
|
private static Abacus abacus = new Abacus(new Configuration( "precise", new String[]{}));
|
||||||
private static Function<NumberInterface, NumberInterface> naivePromotion = i -> new NaiveNumber((i.toString()));
|
private static PromotionFunction naivePromotion = i -> new NaiveNumber((i.toString()));
|
||||||
private static Function<NumberInterface, NumberInterface> precisePromotion = i -> new PreciseNumber((i.toString()));
|
private static PromotionFunction precisePromotion = i -> new PreciseNumber((i.toString()));
|
||||||
|
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
public static void prepareTests() {
|
public static void prepareTests() {
|
||||||
|
|
|
@ -16,7 +16,6 @@ import org.nwapw.abacus.exception.AbacusException;
|
||||||
import org.nwapw.abacus.function.Documentation;
|
import org.nwapw.abacus.function.Documentation;
|
||||||
import org.nwapw.abacus.function.DocumentationType;
|
import org.nwapw.abacus.function.DocumentationType;
|
||||||
import org.nwapw.abacus.number.*;
|
import org.nwapw.abacus.number.*;
|
||||||
import org.nwapw.abacus.plugin.ClassFinder;
|
|
||||||
import org.nwapw.abacus.plugin.PluginListener;
|
import org.nwapw.abacus.plugin.PluginListener;
|
||||||
import org.nwapw.abacus.plugin.PluginManager;
|
import org.nwapw.abacus.plugin.PluginManager;
|
||||||
import org.nwapw.abacus.plugin.standard.StandardPlugin;
|
import org.nwapw.abacus.plugin.standard.StandardPlugin;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package org.nwapw.abacus.plugin;
|
package org.nwapw.abacus.fx;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
Loading…
Reference in New Issue
Block a user