package me.hammerle.snuviscript.code; import java.util.Collection; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.function.Consumer; import java.util.function.Predicate; import me.hammerle.snuviscript.exceptions.PreScriptException; public class SnuviParser { private final ISnuviLogger logger; private final ISnuviScheduler scheduler; private int idCounter; private final HashMap scripts; private final LinkedList termQueue; public SnuviParser(ISnuviLogger logger, ISnuviScheduler scheduler) { this.logger = logger; this.scheduler = scheduler; scripts = new HashMap<>(); termQueue = new LinkedList<>(); idCounter = 0; } public ISnuviLogger getLogger() { return logger; } public ISnuviScheduler getScheduler() { return scheduler; } // ----------------------------------------------------------------------------------- // function registry // ----------------------------------------------------------------------------------- public void registerFunction(String s, ExceptionBiFunction f) { FunctionLoader.registerFunction(s, f); } public void registerAlias(String original, String alias) { FunctionLoader.registerAlias(original, alias); } // ----------------------------------------------------------------------------------- // script controller // ----------------------------------------------------------------------------------- public Script getScript(int id) { return scripts.get(id); } public boolean termUnsafe(Script sc) { if(sc == null) { return false; } sc.isValid = false; sc.onTerm(); return scripts.remove(sc.id) != null; } public void termSafe(Script sc) { if(sc == null) { return; } sc.isHolded = true; sc.isWaiting = true; sc.isValid = false; termQueue.add(sc.id); } private void term() { if(!termQueue.isEmpty()) { termQueue.forEach(i -> { Script sc = scripts.remove(i); if(sc != null) { sc.onTerm(); } }); termQueue.clear(); } } public void termAllUnsafe() { scripts.values().forEach(sc -> { sc.onTerm(); sc.isValid = false; }); scripts.clear(); } public Collection