Files
MingSimulator/Content/JavaScript/puerts/events.js
T

101 lines
3.0 KiB
JavaScript

/*
* Tencent is pleased to support the open source community by making Puerts available.
* Copyright (C) 2020 THL A29 Limited, a Tencent company. All rights reserved.
* Puerts is licensed under the BSD 3-Clause License, except for the third-party components listed in the file 'LICENSE' which may be subject to their corresponding license terms.
* This file is subject to the terms and conditions defined in file 'LICENSE', which is part of this source code package.
*/
(function () {
"use strict";
let events = Object.create(null);
let eventsCount = 0;
function checkListener(listener) {
if (typeof listener !== 'function') {
throw new Error('listener expect a function');
}
}
function on(type, listener, prepend) {
checkListener(listener);
let existing = events[type];
if (existing === undefined) {
events[type] = listener;
++eventsCount;
} else {
if (typeof existing === 'function') {
events[type] = prepend ? [listener, existing] : [existing, listener];
} else if (prepend) {
existing.unshift(listener);
} else {
existing.push(listener);
}
}
}
function off(type, listener) {
checkListener(listener);
const list = events[type];
if (list === undefined)
return;
if (list === listener) {
if (--eventsCount === 0)
events = Object.create(null);
else {
events[type] = undefined;
}
} else if (typeof list !== 'function') {
for (var i = list.length - 1; i >= 0; i--) {
if (list[i] === listener) { //found
if (i === 0)
list.shift();
else {
spliceOne(list, i);
}
if (list.length === 1)
events[type] = list[0];
break;
}
}
}
}
function emit(type, ...args) {
const listener = events[type];
if (listener === undefined)
return false;
if (typeof listener === 'function') {
Reflect.apply(listener, this, args);
} else {
const len = listener.length;
const listeners = arrayClone(listener, len);
for (var i = 0; i < len; ++i)
Reflect.apply(listeners[i], this, args);
}
return true;
}
function arrayClone(arr, n) {
const copy = new Array(n);
for (var i = 0; i < n; ++i)
copy[i] = arr[i];
return copy;
}
function spliceOne(list, index) {
for (; index + 1 < list.length; index++)
list[index] = list[index + 1];
list.pop();
}
puerts.on = on;
puerts.off = off;
puerts.emit = emit;
}());