From d6ee59363fcc445d78bcb8cb1b7a392164635bdd Mon Sep 17 00:00:00 2001 From: TopchetoEU <36534413+TopchetoEU@users.noreply.github.com> Date: Wed, 27 Dec 2023 20:10:11 +0200 Subject: [PATCH] refactor: remove unneeded event system --- src/me/topchetoeu/jscript/Main.java | 18 +---- .../topchetoeu/jscript/events/Awaitable.java | 38 +++++----- src/me/topchetoeu/jscript/events/Event.java | 49 ------------ .../jscript/events/FinishedException.java | 7 -- src/me/topchetoeu/jscript/events/Handle.java | 5 -- .../topchetoeu/jscript/events/Observable.java | 75 ------------------- .../topchetoeu/jscript/events/Observer.java | 7 -- src/me/topchetoeu/jscript/events/Pipe.java | 59 --------------- .../jscript/events/WarmObservable.java | 46 ------------ 9 files changed, 21 insertions(+), 283 deletions(-) delete mode 100644 src/me/topchetoeu/jscript/events/Event.java delete mode 100644 src/me/topchetoeu/jscript/events/FinishedException.java delete mode 100644 src/me/topchetoeu/jscript/events/Handle.java delete mode 100644 src/me/topchetoeu/jscript/events/Observable.java delete mode 100644 src/me/topchetoeu/jscript/events/Observer.java delete mode 100644 src/me/topchetoeu/jscript/events/Pipe.java delete mode 100644 src/me/topchetoeu/jscript/events/WarmObservable.java diff --git a/src/me/topchetoeu/jscript/Main.java b/src/me/topchetoeu/jscript/Main.java index afbc58e..abcc2a8 100644 --- a/src/me/topchetoeu/jscript/Main.java +++ b/src/me/topchetoeu/jscript/Main.java @@ -15,7 +15,6 @@ import me.topchetoeu.jscript.engine.values.ArrayValue; import me.topchetoeu.jscript.engine.values.NativeFunction; import me.topchetoeu.jscript.engine.values.ObjectValue; import me.topchetoeu.jscript.engine.values.Values; -import me.topchetoeu.jscript.events.Observer; import me.topchetoeu.jscript.exceptions.EngineException; import me.topchetoeu.jscript.exceptions.InterruptException; import me.topchetoeu.jscript.exceptions.SyntaxException; @@ -30,22 +29,7 @@ import me.topchetoeu.jscript.modules.ModuleRepo; import me.topchetoeu.jscript.permissions.PermissionsManager; import me.topchetoeu.jscript.permissions.PermissionsProvider; -public class Main { - public static class Printer implements Observer { - public void next(Object data) { - Values.printValue(null, data); - System.out.println(); - } - - public void error(RuntimeException err) { - Values.printError(err, null); - } - - public void finish() { - engineTask.interrupt(); - } - } - +public class Main { static Thread engineTask, debugTask; static Engine engine = new Engine(); static DebugServer debugServer = new DebugServer(); diff --git a/src/me/topchetoeu/jscript/events/Awaitable.java b/src/me/topchetoeu/jscript/events/Awaitable.java index cb0b58a..f72b020 100644 --- a/src/me/topchetoeu/jscript/events/Awaitable.java +++ b/src/me/topchetoeu/jscript/events/Awaitable.java @@ -1,25 +1,27 @@ package me.topchetoeu.jscript.events; -import me.topchetoeu.jscript.exceptions.InterruptException; - public interface Awaitable { - T await() throws FinishedException; + public static interface ResultHandler { + public void onResult(T data); + } + public static interface ErrorHandler { + public void onError(RuntimeException error); + } - default Observable toObservable() { - return sub -> { - var thread = new Thread(() -> { - try { - sub.next(await()); - sub.finish(); - } - catch (InterruptException | FinishedException e) { sub.finish(); } - catch (RuntimeException e) { - sub.error(e); - } - }, "Awaiter"); - thread.start(); + T await(); - return () -> thread.interrupt(); - }; + default void handle(ResultHandler onResult, ErrorHandler onError) { + var thread = new Thread(() -> { + try { + onResult.onResult(await()); + } + catch (RuntimeException e) { + onError.onError(e); + } + }, "Awaiter"); + thread.start(); + } + default void handle(ResultHandler onResult) { + handle(onResult, err -> {}); } } diff --git a/src/me/topchetoeu/jscript/events/Event.java b/src/me/topchetoeu/jscript/events/Event.java deleted file mode 100644 index 225d7ec..0000000 --- a/src/me/topchetoeu/jscript/events/Event.java +++ /dev/null @@ -1,49 +0,0 @@ -package me.topchetoeu.jscript.events; - -import java.util.HashSet; - -public class Event implements Observer, Observable { - private HashSet> handlers = new HashSet<>(); - - public Handle on(Observer handler) { - if (handlers == null) { - handler.finish(); - return () -> {}; - } - - handlers.add(handler); - return () -> { - if (handlers == null) return; - handlers.remove(handler); - }; - } - - public boolean isFinished() { - return handlers == null; - } - - public void next(T value) { - if (handlers == null) throw new IllegalStateException("Cannot use a finished event."); - for (var handler : handlers) { - handler.next(value); - } - } - public void error(RuntimeException value) { - if (handlers == null) throw new IllegalStateException("Cannot use a finished event."); - for (var handler : handlers) { - handler.error(value); - } - - handlers.clear(); - handlers = null; - } - public void finish() { - if (handlers == null) throw new IllegalStateException("Cannot use a finished event."); - for (var handler : handlers) { - handler.finish(); - } - - handlers.clear(); - handlers = null; - } -} diff --git a/src/me/topchetoeu/jscript/events/FinishedException.java b/src/me/topchetoeu/jscript/events/FinishedException.java deleted file mode 100644 index 569aecb..0000000 --- a/src/me/topchetoeu/jscript/events/FinishedException.java +++ /dev/null @@ -1,7 +0,0 @@ -package me.topchetoeu.jscript.events; - -public class FinishedException extends RuntimeException { - public FinishedException() { - super("The observable has ended."); - } -} diff --git a/src/me/topchetoeu/jscript/events/Handle.java b/src/me/topchetoeu/jscript/events/Handle.java deleted file mode 100644 index 4b0edf2..0000000 --- a/src/me/topchetoeu/jscript/events/Handle.java +++ /dev/null @@ -1,5 +0,0 @@ -package me.topchetoeu.jscript.events; - -public interface Handle { - void free(); -} \ No newline at end of file diff --git a/src/me/topchetoeu/jscript/events/Observable.java b/src/me/topchetoeu/jscript/events/Observable.java deleted file mode 100644 index cc72a41..0000000 --- a/src/me/topchetoeu/jscript/events/Observable.java +++ /dev/null @@ -1,75 +0,0 @@ -package me.topchetoeu.jscript.events; - -public interface Observable { - Handle on(Observer val); - - default Handle once(Observer observer) { - // Java is fucking retarded - var unhandler = new Handle[1]; - var shouldUnsub = new boolean[1]; - - unhandler[0] = on(new Observer<>() { - public void next(T data) { - observer.next(data); - if (unhandler[0] == null) shouldUnsub[0] = true; - else unhandler[0].free(); - } - public void error(RuntimeException err) { - observer.error(err); - if (unhandler[0] == null) shouldUnsub[0] = true; - else unhandler[0].free(); - } - public void finish() { - observer.finish(); - if (unhandler[0] == null) shouldUnsub[0] = true; - else unhandler[0].free(); - } - }); - - if (shouldUnsub[0]) { - unhandler[0].free(); - return () -> {}; - } - else return unhandler[0]; - } - @SuppressWarnings("unchecked") - default Awaitable toAwaitable() { - return () -> { - var notifier = new Notifier(); - var valRef = new Object[1]; - var isErrRef = new boolean[1]; - - once(new Observer<>() { - public void next(T data) { - valRef[0] = data; - notifier.next(); - } - public void error(RuntimeException err) { - isErrRef[0] = true; - valRef[0] = err; - notifier.next(); - } - public void finish() { - isErrRef[0] = true; - valRef[0] = new FinishedException(); - notifier.next(); - } - }); - - notifier.await(); - - if (isErrRef[0]) throw (RuntimeException)valRef[0]; - else return (T)valRef[0]; - }; - } - default Observable encapsulate() { - return val -> on(val); - } - - default Observable pipe(Pipe pipe) { - return sub -> on(pipe.apply(sub)); - } - default WarmObservable warmUp() { - return new WarmObservable<>(this); - } -} diff --git a/src/me/topchetoeu/jscript/events/Observer.java b/src/me/topchetoeu/jscript/events/Observer.java deleted file mode 100644 index a687c05..0000000 --- a/src/me/topchetoeu/jscript/events/Observer.java +++ /dev/null @@ -1,7 +0,0 @@ -package me.topchetoeu.jscript.events; - -public interface Observer { - public void next(T data); - public default void error(RuntimeException err) {} - public default void finish() { } -} \ No newline at end of file diff --git a/src/me/topchetoeu/jscript/events/Pipe.java b/src/me/topchetoeu/jscript/events/Pipe.java deleted file mode 100644 index 3199142..0000000 --- a/src/me/topchetoeu/jscript/events/Pipe.java +++ /dev/null @@ -1,59 +0,0 @@ -package me.topchetoeu.jscript.events; - -public interface Pipe { - Observer apply(Observer obs); - // void next(T val, Observer target); - // default void error(RuntimeException err, Observer target) { - // target.error(err); - // } - // default void finish(Observer target) { - // target.finish(); - // } - - public static interface MapFunc { - T2 map(T1 val); - } - - public static Pipe map(MapFunc func) { - return o -> val -> o.next(func.map(val)); - } - public static Pipe filter(MapFunc func) { - return o -> val -> { - if (func.map(val)) o.next(val); - }; - } - public static Pipe skip(int n) { - var i = new int[1]; - - return target -> val -> { - if (i[0] >= n) target.next(val); - else i[0]++; - }; - } - public static Pipe limit(int n) { - return target -> new Observer() { - private int i; - - public void next(T val) { - if (i >= n) target.finish(); - else { - target.next(val); - i++; - } - } - public void error(RuntimeException err) { - if (i < n) target.error(err); - } - public void finish() { - if (i < n) target.finish(); - } - }; - } - public static Pipe first() { - return limit(1); - } - - public static Pipe, T> merge() { - return target -> val -> val.on(target); - } -} \ No newline at end of file diff --git a/src/me/topchetoeu/jscript/events/WarmObservable.java b/src/me/topchetoeu/jscript/events/WarmObservable.java deleted file mode 100644 index 1d98cd7..0000000 --- a/src/me/topchetoeu/jscript/events/WarmObservable.java +++ /dev/null @@ -1,46 +0,0 @@ -package me.topchetoeu.jscript.events; - -import java.util.HashSet; - -public class WarmObservable implements Observable, Handle { - private HashSet> observers = new HashSet<>(); - private Handle handle; - - @Override - public Handle on(Observer val) { - if (observers == null) return () -> {}; - observers.add(val); - return () -> observers.remove(val); - } - - @Override - public void free() { - if (observers == null) return; - handle.free(); - handle = null; - observers = null; - } - - public WarmObservable(Observable observable) { - observable.on(new Observer<>() { - public void next(T data) { - for (var obs : observers) obs.next(data); - } - public void error(RuntimeException err) { - for (var obs : observers) obs.error(err); - handle = null; - observers = null; - } - public void finish() { - for (var obs : observers) obs.finish(); - handle = null; - observers = null; - } - }); - } - - @Override - public WarmObservable warmUp() { - return this; - } -}