From bd6c2b5114520fc5ffc40867d7e5d79e88d27b87 Mon Sep 17 00:00:00 2001 From: kovacsv Date: Sat, 2 Jul 2022 22:25:34 +0200 Subject: [PATCH] Add EventSource class. --- source/engine/core/eventsource.js | 27 +++++++++++++++++++++++++++ source/engine/main.js | 2 ++ test/tests/core_test.js | 18 ++++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 source/engine/core/eventsource.js diff --git a/source/engine/core/eventsource.js b/source/engine/core/eventsource.js new file mode 100644 index 0000000..adee2a4 --- /dev/null +++ b/source/engine/core/eventsource.js @@ -0,0 +1,27 @@ +export class EventSource +{ + constructor () + { + this.eventListeners = new Map (); + } + + AddEventListener (name, listener) + { + if (!this.eventListeners.has (name)) { + this.eventListeners.set (name, []); + } + let listeners = this.eventListeners.get (name); + listeners.push (listener); + } + + NotifyEventListeners (name, ...args) + { + if (!this.eventListeners.has (name)) { + return; + } + let listeners = this.eventListeners.get (name); + for (let listener of listeners) { + listener (...args); + } + } +} diff --git a/source/engine/main.js b/source/engine/main.js index bbfb270..2ac6b22 100644 --- a/source/engine/main.js +++ b/source/engine/main.js @@ -1,4 +1,5 @@ import { IsDefined, ValueOrDefault, CopyObjectAttributes, IsObjectEmpty, EscapeHtmlChars } from './core/core.js'; +import { EventSource } from './core/eventsource.js'; import { TaskRunner, RunTaskAsync, RunTasks, RunTasksBatch, WaitWhile } from './core/taskrunner.js'; import { Exporter } from './export/exporter.js'; import { Exporter3dm } from './export/exporter3dm.js'; @@ -76,6 +77,7 @@ export { CopyObjectAttributes, IsObjectEmpty, EscapeHtmlChars, + EventSource, TaskRunner, RunTaskAsync, RunTasks, diff --git a/test/tests/core_test.js b/test/tests/core_test.js index 006c99c..a729a15 100644 --- a/test/tests/core_test.js +++ b/test/tests/core_test.js @@ -46,6 +46,24 @@ describe ('Core', function () { OV.CopyObjectAttributes (src, dest3); assert.deepStrictEqual (dest3, {a : null, b : null, c : 6}); }); + + it ('Event Source', function () { + let es = new OV.EventSource (); + let sumValues = 0; + es.AddEventListener ('first_event', (x) => { + sumValues += x; + }); + es.AddEventListener ('first_event', (x) => { + sumValues += 2 * x; + }); + es.AddEventListener ('second_event', (x, y) => { + sumValues += 3 * x; + sumValues += 3 * y; + }); + es.NotifyEventListeners ('first_event', 5); + es.NotifyEventListeners ('second_event', 10, 15); + assert.strictEqual (sumValues, 90); + }); }); }