@panyam/tsutils 0.0.61 → 0.0.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/comms/events.d.ts +6 -4
- package/lib/cjs/comms/events.js +26 -11
- package/lib/cjs/comms/events.js.map +1 -1
- package/lib/cjs/list.d.ts +3 -3
- package/lib/cjs/list.js +19 -36
- package/lib/cjs/list.js.map +1 -1
- package/lib/esm/comms/events.d.ts +6 -4
- package/lib/esm/comms/events.js +26 -11
- package/lib/esm/comms/events.js.map +1 -1
- package/lib/esm/list.d.ts +3 -3
- package/lib/esm/list.js +19 -36
- package/lib/esm/list.js.map +1 -1
- package/package.json +1 -1
|
@@ -35,10 +35,6 @@ export declare class EventEmitter {
|
|
|
35
35
|
}
|
|
36
36
|
export declare class EventHub {
|
|
37
37
|
private _handlers;
|
|
38
|
-
private _muted;
|
|
39
|
-
get isMuted(): boolean;
|
|
40
|
-
mute(): void;
|
|
41
|
-
unmute(): void;
|
|
42
38
|
on(names: Array<string> | string, callback: EventCallback): this;
|
|
43
39
|
removeOn(names: Array<string> | string, callback: EventCallback): this;
|
|
44
40
|
_ensurestrings(names: Array<string> | string): string[];
|
|
@@ -50,6 +46,12 @@ export declare class EventHub {
|
|
|
50
46
|
}, handler: T): this;
|
|
51
47
|
emit(name: string, source: any, payload?: any): boolean;
|
|
52
48
|
dispatchEvent(event: TEvent): boolean;
|
|
49
|
+
static BATCH_EVENTS: string;
|
|
50
|
+
protected _events: TEvent[];
|
|
51
|
+
protected _inBatchMode: boolean;
|
|
52
|
+
startBatchMode(): this;
|
|
53
|
+
cancelBatch(): void;
|
|
54
|
+
commitBatch(): void;
|
|
53
55
|
}
|
|
54
56
|
export declare class StateMachine {
|
|
55
57
|
private _states;
|
package/lib/cjs/comms/events.js
CHANGED
|
@@ -71,16 +71,8 @@ exports.EventEmitter = EventEmitter;
|
|
|
71
71
|
class EventHub {
|
|
72
72
|
constructor() {
|
|
73
73
|
this._handlers = {};
|
|
74
|
-
this.
|
|
75
|
-
|
|
76
|
-
get isMuted() {
|
|
77
|
-
return this._muted;
|
|
78
|
-
}
|
|
79
|
-
mute() {
|
|
80
|
-
this._muted = true;
|
|
81
|
-
}
|
|
82
|
-
unmute() {
|
|
83
|
-
this._muted = false;
|
|
74
|
+
this._events = [];
|
|
75
|
+
this._inBatchMode = false;
|
|
84
76
|
}
|
|
85
77
|
on(names, callback) {
|
|
86
78
|
return this._addHandler(names, this._handlers, callback);
|
|
@@ -116,7 +108,14 @@ class EventHub {
|
|
|
116
108
|
return this;
|
|
117
109
|
}
|
|
118
110
|
emit(name, source, payload) {
|
|
119
|
-
|
|
111
|
+
const evt = new TEvent(name, source, payload);
|
|
112
|
+
if (this._inBatchMode) {
|
|
113
|
+
this._events.push(evt);
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
return this.dispatchEvent(evt);
|
|
118
|
+
}
|
|
120
119
|
}
|
|
121
120
|
dispatchEvent(event) {
|
|
122
121
|
const evtCallbacks = this._handlers[event.name] || [];
|
|
@@ -127,8 +126,24 @@ class EventHub {
|
|
|
127
126
|
}
|
|
128
127
|
return true;
|
|
129
128
|
}
|
|
129
|
+
startBatchMode() {
|
|
130
|
+
if (!this._inBatchMode) {
|
|
131
|
+
this._inBatchMode = true;
|
|
132
|
+
}
|
|
133
|
+
return this;
|
|
134
|
+
}
|
|
135
|
+
cancelBatch() {
|
|
136
|
+
this._inBatchMode = false;
|
|
137
|
+
this._events = [];
|
|
138
|
+
}
|
|
139
|
+
commitBatch() {
|
|
140
|
+
this._inBatchMode = false;
|
|
141
|
+
this.emit(EventHub.BATCH_EVENTS, this, this._events);
|
|
142
|
+
this._events = [];
|
|
143
|
+
}
|
|
130
144
|
}
|
|
131
145
|
exports.EventHub = EventHub;
|
|
146
|
+
EventHub.BATCH_EVENTS = "BatchEvents";
|
|
132
147
|
class StateMachine {
|
|
133
148
|
constructor() {
|
|
134
149
|
this._states = {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/comms/events.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable, Timestamp } from \"../types\";\n\n/**\n * Super class of all Events.\n */\nexport class TEvent {\n // Globally unique ID for all events.\n private static counter = 0;\n readonly uuid = TEvent.counter++;\n\n /**\n * The event this event was spawned from (if any).\n */\n protected _spawnedFrom: Nullable<this> = null;\n\n /**\n * Name of the event.\n */\n readonly name: string;\n\n /**\n * Source from which this event is originating.\n */\n readonly source: any;\n\n /**\n * Source state that is set by the source of the event only\n * *it* can use.\n */\n sourceState: any = null;\n\n /**\n * Event specific payload.\n */\n payload: any;\n\n /**\n * Whether the event was cancelled.\n */\n cancelled = false;\n\n /**\n * Timestamp of the event - optional.\n */\n timeStamp: Timestamp = -1;\n\n /**\n * All child events that were spawned from this Event.\n * The parent/spawnedFrom and child event references help us\n * form a call tree/trace of a events as it traverses\n * the system.\n */\n children: TEvent[] = [];\n\n constructor(name: string, source: any, payload?: any) {\n this.name = name;\n this.source = source;\n this.payload = payload;\n }\n\n get spawnedFrom(): Nullable<this> {\n return this._spawnedFrom;\n }\n\n protected setSpawnedFrom(msg: Nullable<this>): void {\n this._spawnedFrom = msg;\n if (msg == null) this._rootEvent = this;\n else this._rootEvent = msg.rootEvent;\n }\n\n spawn(name: string, source: any, payload?: any): TEvent {\n const child = new TEvent(name, source, payload);\n child.setSpawnedFrom(this);\n this.children.push(child);\n return child;\n }\n\n /**\n * The first/root message in the forward chain.\n */\n private _rootEvent: this;\n\n get rootEvent(): this {\n return this._rootEvent as this;\n }\n}\n\nexport class State {\n private static counter = 0;\n stateData: any = null;\n readonly id = State.counter++;\n\n get name(): string {\n return this.constructor.name;\n }\n\n enter(data: any): void {\n this.stateData = data;\n }\n\n handle(event: TEvent): void {\n // todo\n }\n}\n\nexport type EventCallback = ((event: TEvent) => void) | ((event: TEvent) => Promise<void>);\n\nexport class EventEmitter {\n protected _eventHub: EventHub | null;\n constructor() {\n this._eventHub = new EventHub();\n }\n get eventHub(): EventHub | null {\n return this._eventHub;\n }\n set eventHub(hub: EventHub | null) {\n const oldHub = this._eventHub;\n this._eventHub = hub;\n this.eventHubChanged(oldHub);\n }\n protected eventHubChanged(oldHub: EventHub | null): void {\n // Do nothing\n console.log(\"WARNING - EventHub Change Listener not implemented: \", this.constructor.name);\n }\n}\n\nexport class EventHub {\n private _handlers: { [key: string]: Array<EventCallback> } = {};\n private _muted = false;\n\n get isMuted(): boolean {\n return this._muted;\n }\n\n mute(): void {\n this._muted = true;\n }\n\n unmute(): void {\n this._muted = false;\n }\n\n on(names: Array<string> | string, callback: EventCallback): this {\n return this._addHandler(names, this._handlers, callback);\n }\n\n removeOn(names: Array<string> | string, callback: EventCallback): this {\n return this._removeHandler(names, this._handlers, callback);\n }\n\n _ensurestrings(names: Array<string> | string): string[] {\n if (typeof names === \"string\") {\n names = (names as string).split(\",\");\n }\n return names.map(function (v) {\n return v.trim();\n });\n }\n\n _addHandler<T>(names: Array<string> | string, handlerlist: { [key: string]: Array<T> }, handler: T): this {\n this._ensurestrings(names).forEach(function (name) {\n handlerlist[name] = handlerlist[name] || [];\n handlerlist[name].push(handler);\n });\n return this;\n }\n\n _removeHandler<T>(names: Array<string> | string, handlerlist: { [key: string]: Array<T> }, handler: T): this {\n this._ensurestrings(names).forEach(function (name) {\n const evHandlers = handlerlist[name] || [];\n for (let i = 0; i < evHandlers.length; i++) {\n if (evHandlers[i] == handler) {\n evHandlers.splice(i, 1);\n break;\n }\n }\n });\n return this;\n }\n\n emit(name: string, source: any, payload?: any): boolean {\n return this.dispatchEvent(new TEvent(name, source, payload));\n }\n\n dispatchEvent(event: TEvent): boolean {\n const evtCallbacks = this._handlers[event.name] || [];\n for (const callback of evtCallbacks) {\n callback(event);\n if (event.cancelled) return false;\n }\n return true;\n }\n}\n\n/**\n * StateMachines allow declarative and stateful chaining of events.\n */\nexport class StateMachine {\n private _states: { [key: string]: State } = {};\n private _rootState: Nullable<State> = null;\n private _currentState: Nullable<State> = null;\n constructor() {\n this._states = {};\n this._rootState = null;\n this._currentState = null;\n }\n\n /**\n * The starting/root state of the machine.\n *\n * @param {String} name Name of the default/root state.\n */\n set rootState(name: string) {\n this._rootState = this.getState(name);\n if (this._currentState == null) {\n this._currentState = this._rootState;\n }\n }\n\n /**\n * Exits the current state (if any) and enters a new state.\n *\n * @param {String} state Name of the new state to enter.\n * @param {Object} data State specific data for the state handler to use for the new state.\n */\n enter(state: string, data: any = null): void {\n if (state == \"\") {\n this._currentState = this._rootState;\n } else {\n this._currentState = this.getState(state);\n }\n if (this._currentState != null) {\n this._currentState.enter(data);\n }\n }\n\n /**\n * Get the state by name.\n *\n * @param {String} name Name of the state being queried.\n * @returns {State} State object associated with the name.\n */\n getState(name: string): State {\n if (!(name in this._states)) {\n throw Error(\"State '\" + name + \"' not yet registered.\");\n }\n return this._states[name];\n }\n\n /**\n * Register a new state in the state machine.\n *\n * @param {State} state State being registered. If another State with\n * the same name exists, then a {DuplicateError} is thrown.\n * @param {Bool} isRoot Whether the new state is a root state.\n */\n registerState(state: State, isRoot = false): void {\n const name = state.name;\n if (name in this._states) {\n throw Error(\"State '\" + name + \"' already registered.\");\n }\n this._states[name] = state;\n if (isRoot || false) {\n this.rootState = state.name;\n }\n }\n\n /**\n * Handles an event from the current state in the state machine possibly resulting in a state transition.\n *\n * @param {Object} name Type of event being sent.\n * @param {EventSource} source The source generating the event.\n * @param {Object} data The event specific data.\n */\n handle(event: TEvent): void {\n if (this._currentState == null) return;\n\n const nextState: any = this._currentState.handle(event);\n if (nextState != null) {\n if (nextState == \"\") {\n if (this._rootState != null) {\n this.enter(this._rootState.name);\n } else {\n throw new Error(\"Root state has not been set\");\n }\n } else {\n this.enter(nextState);\n }\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/comms/events.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable, Timestamp } from \"../types\";\n\n/**\n * Super class of all Events.\n */\nexport class TEvent {\n // Globally unique ID for all events.\n private static counter = 0;\n readonly uuid = TEvent.counter++;\n\n /**\n * The event this event was spawned from (if any).\n */\n protected _spawnedFrom: Nullable<this> = null;\n\n /**\n * Name of the event.\n */\n readonly name: string;\n\n /**\n * Source from which this event is originating.\n */\n readonly source: any;\n\n /**\n * Source state that is set by the source of the event only\n * *it* can use.\n */\n sourceState: any = null;\n\n /**\n * Event specific payload.\n */\n payload: any;\n\n /**\n * Whether the event was cancelled.\n */\n cancelled = false;\n\n /**\n * Timestamp of the event - optional.\n */\n timeStamp: Timestamp = -1;\n\n /**\n * All child events that were spawned from this Event.\n * The parent/spawnedFrom and child event references help us\n * form a call tree/trace of a events as it traverses\n * the system.\n */\n children: TEvent[] = [];\n\n constructor(name: string, source: any, payload?: any) {\n this.name = name;\n this.source = source;\n this.payload = payload;\n }\n\n get spawnedFrom(): Nullable<this> {\n return this._spawnedFrom;\n }\n\n protected setSpawnedFrom(msg: Nullable<this>): void {\n this._spawnedFrom = msg;\n if (msg == null) this._rootEvent = this;\n else this._rootEvent = msg.rootEvent;\n }\n\n spawn(name: string, source: any, payload?: any): TEvent {\n const child = new TEvent(name, source, payload);\n child.setSpawnedFrom(this);\n this.children.push(child);\n return child;\n }\n\n /**\n * The first/root message in the forward chain.\n */\n private _rootEvent: this;\n\n get rootEvent(): this {\n return this._rootEvent as this;\n }\n}\n\nexport class State {\n private static counter = 0;\n stateData: any = null;\n readonly id = State.counter++;\n\n get name(): string {\n return this.constructor.name;\n }\n\n enter(data: any): void {\n this.stateData = data;\n }\n\n handle(event: TEvent): void {\n // todo\n }\n}\n\nexport type EventCallback = ((event: TEvent) => void) | ((event: TEvent) => Promise<void>);\n\nexport class EventEmitter {\n protected _eventHub: EventHub | null;\n constructor() {\n this._eventHub = new EventHub();\n }\n get eventHub(): EventHub | null {\n return this._eventHub;\n }\n set eventHub(hub: EventHub | null) {\n const oldHub = this._eventHub;\n this._eventHub = hub;\n this.eventHubChanged(oldHub);\n }\n protected eventHubChanged(oldHub: EventHub | null): void {\n // Do nothing\n console.log(\"WARNING - EventHub Change Listener not implemented: \", this.constructor.name);\n }\n}\n\nexport class EventHub {\n private _handlers: { [key: string]: Array<EventCallback> } = {};\n\n on(names: Array<string> | string, callback: EventCallback): this {\n return this._addHandler(names, this._handlers, callback);\n }\n\n removeOn(names: Array<string> | string, callback: EventCallback): this {\n return this._removeHandler(names, this._handlers, callback);\n }\n\n _ensurestrings(names: Array<string> | string): string[] {\n if (typeof names === \"string\") {\n names = (names as string).split(\",\");\n }\n return names.map(function (v) {\n return v.trim();\n });\n }\n\n _addHandler<T>(names: Array<string> | string, handlerlist: { [key: string]: Array<T> }, handler: T): this {\n this._ensurestrings(names).forEach(function (name) {\n handlerlist[name] = handlerlist[name] || [];\n handlerlist[name].push(handler);\n });\n return this;\n }\n\n _removeHandler<T>(names: Array<string> | string, handlerlist: { [key: string]: Array<T> }, handler: T): this {\n this._ensurestrings(names).forEach(function (name) {\n const evHandlers = handlerlist[name] || [];\n for (let i = 0; i < evHandlers.length; i++) {\n if (evHandlers[i] == handler) {\n evHandlers.splice(i, 1);\n break;\n }\n }\n });\n return this;\n }\n\n emit(name: string, source: any, payload?: any): boolean {\n const evt = new TEvent(name, source, payload);\n if (this._inBatchMode) {\n this._events.push(evt);\n return true;\n } else {\n return this.dispatchEvent(evt);\n }\n }\n\n dispatchEvent(event: TEvent): boolean {\n const evtCallbacks = this._handlers[event.name] || [];\n for (const callback of evtCallbacks) {\n callback(event);\n if (event.cancelled) return false;\n }\n return true;\n }\n\n // Support for transactional/batch event handling, where\n // the user can allow a bunch of events to first collect\n // before triggering a batch dispatch\n public static BATCH_EVENTS = \"BatchEvents\";\n protected _events: TEvent[] = [];\n protected _inBatchMode = false;\n startBatchMode(): this {\n if (!this._inBatchMode) {\n this._inBatchMode = true;\n }\n return this;\n }\n\n cancelBatch(): void {\n this._inBatchMode = false;\n this._events = [];\n }\n\n commitBatch(): void {\n this._inBatchMode = false;\n this.emit(EventHub.BATCH_EVENTS, this, this._events);\n this._events = [];\n }\n}\n\n/**\n * StateMachines allow declarative and stateful chaining of events.\n */\nexport class StateMachine {\n private _states: { [key: string]: State } = {};\n private _rootState: Nullable<State> = null;\n private _currentState: Nullable<State> = null;\n constructor() {\n this._states = {};\n this._rootState = null;\n this._currentState = null;\n }\n\n /**\n * The starting/root state of the machine.\n *\n * @param {String} name Name of the default/root state.\n */\n set rootState(name: string) {\n this._rootState = this.getState(name);\n if (this._currentState == null) {\n this._currentState = this._rootState;\n }\n }\n\n /**\n * Exits the current state (if any) and enters a new state.\n *\n * @param {String} state Name of the new state to enter.\n * @param {Object} data State specific data for the state handler to use for the new state.\n */\n enter(state: string, data: any = null): void {\n if (state == \"\") {\n this._currentState = this._rootState;\n } else {\n this._currentState = this.getState(state);\n }\n if (this._currentState != null) {\n this._currentState.enter(data);\n }\n }\n\n /**\n * Get the state by name.\n *\n * @param {String} name Name of the state being queried.\n * @returns {State} State object associated with the name.\n */\n getState(name: string): State {\n if (!(name in this._states)) {\n throw Error(\"State '\" + name + \"' not yet registered.\");\n }\n return this._states[name];\n }\n\n /**\n * Register a new state in the state machine.\n *\n * @param {State} state State being registered. If another State with\n * the same name exists, then a {DuplicateError} is thrown.\n * @param {Bool} isRoot Whether the new state is a root state.\n */\n registerState(state: State, isRoot = false): void {\n const name = state.name;\n if (name in this._states) {\n throw Error(\"State '\" + name + \"' already registered.\");\n }\n this._states[name] = state;\n if (isRoot || false) {\n this.rootState = state.name;\n }\n }\n\n /**\n * Handles an event from the current state in the state machine possibly resulting in a state transition.\n *\n * @param {Object} name Type of event being sent.\n * @param {EventSource} source The source generating the event.\n * @param {Object} data The event specific data.\n */\n handle(event: TEvent): void {\n if (this._currentState == null) return;\n\n const nextState: any = this._currentState.handle(event);\n if (nextState != null) {\n if (nextState == \"\") {\n if (this._rootState != null) {\n this.enter(this._rootState.name);\n } else {\n throw new Error(\"Root state has not been set\");\n }\n } else {\n this.enter(nextState);\n }\n }\n }\n}\n"]}
|
package/lib/cjs/list.d.ts
CHANGED
|
@@ -23,12 +23,12 @@ export declare class ValueList<V extends ListNode<V>> {
|
|
|
23
23
|
get last(): Nullable<V>;
|
|
24
24
|
reversedValues(): Generator<V>;
|
|
25
25
|
values(): Generator<V>;
|
|
26
|
-
popBack(): V;
|
|
27
|
-
popFront(): V;
|
|
28
26
|
add(child: V, before?: Nullable<V>): this;
|
|
29
27
|
pushFront(value: V): this;
|
|
30
|
-
|
|
28
|
+
pushBack(value: V): this;
|
|
31
29
|
remove(child: V): this;
|
|
30
|
+
popBack(): V;
|
|
31
|
+
popFront(): V;
|
|
32
32
|
}
|
|
33
33
|
export declare class List<V> {
|
|
34
34
|
private container;
|
package/lib/cjs/list.js
CHANGED
|
@@ -14,7 +14,7 @@ class ValueList {
|
|
|
14
14
|
this._lastChild = null;
|
|
15
15
|
this._size = 0;
|
|
16
16
|
for (const v of values)
|
|
17
|
-
this.
|
|
17
|
+
this.pushBack(v);
|
|
18
18
|
}
|
|
19
19
|
toJSON() {
|
|
20
20
|
return Array.from(this.values());
|
|
@@ -69,38 +69,6 @@ class ValueList {
|
|
|
69
69
|
tmp = tmp.nextSibling;
|
|
70
70
|
}
|
|
71
71
|
}
|
|
72
|
-
popBack() {
|
|
73
|
-
if (this._lastChild == null) {
|
|
74
|
-
throw new Error("No children");
|
|
75
|
-
}
|
|
76
|
-
const out = this._lastChild;
|
|
77
|
-
const prev = this._lastChild.prevSibling;
|
|
78
|
-
this._size--;
|
|
79
|
-
if (prev == null) {
|
|
80
|
-
this._firstChild = this._lastChild = null;
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
prev.nextSibling = null;
|
|
84
|
-
this._lastChild = prev;
|
|
85
|
-
}
|
|
86
|
-
return out;
|
|
87
|
-
}
|
|
88
|
-
popFront() {
|
|
89
|
-
if (this._firstChild == null) {
|
|
90
|
-
throw new Error("No children");
|
|
91
|
-
}
|
|
92
|
-
const out = this._firstChild;
|
|
93
|
-
const next = this._firstChild.nextSibling;
|
|
94
|
-
this._size--;
|
|
95
|
-
if (next == null) {
|
|
96
|
-
this._firstChild = this._lastChild = null;
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
next.prevSibling = null;
|
|
100
|
-
this._firstChild = next;
|
|
101
|
-
}
|
|
102
|
-
return out;
|
|
103
|
-
}
|
|
104
72
|
add(child, before = null) {
|
|
105
73
|
if (child.nextSibling != null || child.prevSibling != null) {
|
|
106
74
|
throw new Error("New node already added to a list. Remove it first");
|
|
@@ -136,7 +104,7 @@ class ValueList {
|
|
|
136
104
|
pushFront(value) {
|
|
137
105
|
return this.add(value, this._firstChild);
|
|
138
106
|
}
|
|
139
|
-
|
|
107
|
+
pushBack(value) {
|
|
140
108
|
return this.add(value);
|
|
141
109
|
}
|
|
142
110
|
remove(child) {
|
|
@@ -158,11 +126,26 @@ class ValueList {
|
|
|
158
126
|
else {
|
|
159
127
|
prev.nextSibling = next;
|
|
160
128
|
}
|
|
161
|
-
|
|
162
|
-
this._size--;
|
|
129
|
+
this._size--;
|
|
163
130
|
child.prevSibling = child.nextSibling = null;
|
|
164
131
|
return this;
|
|
165
132
|
}
|
|
133
|
+
popBack() {
|
|
134
|
+
if (this._lastChild == null) {
|
|
135
|
+
throw new Error("No children");
|
|
136
|
+
}
|
|
137
|
+
const out = this._lastChild;
|
|
138
|
+
this.remove(out);
|
|
139
|
+
return out;
|
|
140
|
+
}
|
|
141
|
+
popFront() {
|
|
142
|
+
if (this._firstChild == null) {
|
|
143
|
+
throw new Error("No children");
|
|
144
|
+
}
|
|
145
|
+
const out = this._firstChild;
|
|
146
|
+
this.remove(out);
|
|
147
|
+
return out;
|
|
148
|
+
}
|
|
166
149
|
}
|
|
167
150
|
exports.ValueList = ValueList;
|
|
168
151
|
class List {
|
package/lib/cjs/list.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/list.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable } from \"./types\";\n\nexport interface ListNode<V> {\n nextSibling: Nullable<V>;\n prevSibling: Nullable<V>;\n}\n\nclass MutableListNode<V> implements ListNode<MutableListNode<V>> {\n nextSibling: Nullable<MutableListNode<V>> = null;\n prevSibling: Nullable<MutableListNode<V>> = null;\n constructor(public value: V) {}\n}\n\n/**\n * A list implementation where the value itself contains next and prev pointers\n * so we do not need to create wrapper classes.\n */\nexport class ValueList<V extends ListNode<V>> {\n protected _firstChild: Nullable<V> = null;\n protected _lastChild: Nullable<V> = null;\n protected _size = 0;\n\n constructor(...values: V[]) {\n for (const v of values) this.push(v);\n }\n\n toJSON(): V[] {\n return Array.from(this.values());\n }\n\n forEach(method: (val: V) => boolean | any): number {\n let tmp: V | null = this._firstChild;\n let count = 0;\n while (tmp != null) {\n if (method(tmp) == false) {\n break;\n }\n count++;\n tmp = tmp.nextSibling;\n }\n return count;\n }\n\n equals(another: ValueList<V>, eqlFunc: (val1: V, val2: V) => boolean): boolean {\n if (this.size != another.size) return false;\n let tmp = this.first;\n let tmp2 = another.first;\n for (; tmp != null && tmp2 != null; tmp = tmp.nextSibling, tmp2 = tmp2.nextSibling) {\n if (!eqlFunc(tmp, tmp2)) {\n return false;\n }\n }\n return tmp == null && tmp2 == null;\n }\n\n get isEmpty(): boolean {\n return this._size == 0;\n }\n\n get size(): number {\n return this._size;\n }\n\n get first(): Nullable<V> {\n return this._firstChild;\n }\n\n get last(): Nullable<V> {\n return this._lastChild;\n }\n\n /**\n * Generator of values in reverse order.\n */\n *reversedValues(): Generator<V> {\n let tmp = this._lastChild;\n while (tmp != null) {\n yield tmp;\n tmp = tmp.prevSibling;\n }\n }\n\n /**\n * Generator of values in forward order.\n */\n *values(): Generator<V> {\n let tmp = this._firstChild;\n while (tmp != null) {\n yield tmp;\n tmp = tmp.nextSibling;\n }\n }\n\n popBack(): V {\n if (this._lastChild == null) {\n throw new Error(\"No children\");\n }\n const out = this._lastChild;\n const prev = this._lastChild.prevSibling;\n this._size--;\n if (prev == null) {\n this._firstChild = this._lastChild = null;\n } else {\n prev.nextSibling = null;\n this._lastChild = prev;\n }\n return out;\n }\n\n popFront(): V {\n if (this._firstChild == null) {\n throw new Error(\"No children\");\n }\n const out = this._firstChild;\n const next = this._firstChild.nextSibling;\n this._size--;\n if (next == null) {\n this._firstChild = this._lastChild = null;\n } else {\n next.prevSibling = null;\n this._firstChild = next;\n }\n return out;\n }\n\n add(child: V, before: Nullable<V> = null): this {\n // Ensure that this node is not added anywhere else\n if (child.nextSibling != null || child.prevSibling != null) {\n throw new Error(\"New node already added to a list. Remove it first\");\n }\n child.nextSibling = child.prevSibling = null;\n this._size++;\n if (this._firstChild == null || this._lastChild == null) {\n this._firstChild = this._lastChild = child;\n } else if (before == null) {\n child.prevSibling = this._lastChild;\n child.nextSibling = null;\n this._lastChild.nextSibling = child;\n this._lastChild = child;\n } else if (before == this._firstChild) {\n child.nextSibling = before;\n child.prevSibling = null;\n this._firstChild.prevSibling = child;\n this._firstChild = child;\n } else {\n const prev = before.prevSibling;\n child.nextSibling = before;\n before.prevSibling = child;\n child.prevSibling = prev;\n if (prev != null) {\n prev.nextSibling = child;\n }\n }\n return this;\n }\n\n pushFront(value: V): this {\n return this.add(value, this._firstChild);\n }\n\n push(value: V): this {\n return this.add(value);\n }\n\n /**\n * Removes a child node from this list.\n * It is upto the caller to ensure that this node indeed belongs\n * to this list otherwise deletion of a non belonging node could result\n * in undefined behaviour.\n */\n remove(child: V): this {\n const next = child.nextSibling;\n const prev = child.prevSibling;\n\n if (next == null) {\n this._lastChild = prev;\n if (prev == null) this._firstChild = null;\n } else {\n next.prevSibling = prev;\n }\n\n if (prev == null) {\n this._firstChild = next;\n if (next == null) this._lastChild = null;\n } else {\n prev.nextSibling = next;\n }\n\n if (next != null || prev != null) this._size--;\n\n child.prevSibling = child.nextSibling = null;\n return this;\n }\n}\n\n/**\n * A list implementation where the values themselves need to be wrapper in a list node.\n * If values already have sibling node properties they can be direclty used\n * via ValueLists.\n */\nexport class List<V> {\n private container: ValueList<MutableListNode<V>>;\n\n constructor(...values: V[]) {\n this.container = new ValueList<MutableListNode<V>>();\n for (const v of values) this.push(v);\n }\n\n toJSON(): V[] {\n return Array.from(this.values());\n }\n\n forEach(method: (val: V) => boolean | any): number {\n return this.container.forEach((v) => method(v.value));\n }\n\n equals(another: List<V>, eqlFunc: (val1: V, val2: V) => boolean): boolean {\n return this.container.equals(another.container, (a, b) => eqlFunc(a.value, b.value));\n }\n\n find(target: V): Nullable<MutableListNode<V>> {\n for (const v of this.container.values()) {\n if (target == v.value) {\n return v;\n }\n }\n return null;\n }\n\n get isEmpty(): boolean {\n return this.container.isEmpty;\n }\n\n get size(): number {\n return this.container.size;\n }\n\n get first(): Nullable<MutableListNode<V>> {\n return this.container.first;\n }\n\n get last(): Nullable<MutableListNode<V>> {\n return this.container.last;\n }\n\n /**\n * Generator of values in reverse order.\n */\n *reversedValues(): Generator<V> {\n for (const v of this.container.reversedValues()) yield v.value;\n }\n\n /**\n * Generator of values in forward order.\n */\n *values(): Generator<V> {\n for (const v of this.container.values()) yield v.value;\n }\n\n popBack(): V {\n return this.container.popBack().value;\n }\n\n popFront(): V {\n return this.container.popFront().value;\n }\n\n pushFront(value: V): this {\n return this.add(value, this.container.first);\n }\n\n push(value: V): this {\n return this.add(value);\n }\n\n add(child: V, before: Nullable<MutableListNode<V>> = null): this {\n this.container.add(new MutableListNode(child), before);\n return this;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/list.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable } from \"./types\";\n\nexport interface ListNode<V> {\n nextSibling: Nullable<V>;\n prevSibling: Nullable<V>;\n}\n\nclass MutableListNode<V> implements ListNode<MutableListNode<V>> {\n nextSibling: Nullable<MutableListNode<V>> = null;\n prevSibling: Nullable<MutableListNode<V>> = null;\n constructor(public value: V) {}\n}\n\n/**\n * A list implementation where the value itself contains next and prev pointers\n * so we do not need to create wrapper classes.\n */\nexport class ValueList<V extends ListNode<V>> {\n protected _firstChild: Nullable<V> = null;\n protected _lastChild: Nullable<V> = null;\n protected _size = 0;\n\n constructor(...values: V[]) {\n for (const v of values) this.pushBack(v);\n }\n\n toJSON(): V[] {\n return Array.from(this.values());\n }\n\n forEach(method: (val: V) => boolean | any): number {\n let tmp: V | null = this._firstChild;\n let count = 0;\n while (tmp != null) {\n if (method(tmp) == false) {\n break;\n }\n count++;\n tmp = tmp.nextSibling;\n }\n return count;\n }\n\n equals(another: ValueList<V>, eqlFunc: (val1: V, val2: V) => boolean): boolean {\n if (this.size != another.size) return false;\n let tmp = this.first;\n let tmp2 = another.first;\n for (; tmp != null && tmp2 != null; tmp = tmp.nextSibling, tmp2 = tmp2.nextSibling) {\n if (!eqlFunc(tmp, tmp2)) {\n return false;\n }\n }\n return tmp == null && tmp2 == null;\n }\n\n get isEmpty(): boolean {\n return this._size == 0;\n }\n\n get size(): number {\n return this._size;\n }\n\n get first(): Nullable<V> {\n return this._firstChild;\n }\n\n get last(): Nullable<V> {\n return this._lastChild;\n }\n\n /**\n * Generator of values in reverse order.\n */\n *reversedValues(): Generator<V> {\n let tmp = this._lastChild;\n while (tmp != null) {\n yield tmp;\n tmp = tmp.prevSibling;\n }\n }\n\n /**\n * Generator of values in forward order.\n */\n *values(): Generator<V> {\n let tmp = this._firstChild;\n while (tmp != null) {\n yield tmp;\n tmp = tmp.nextSibling;\n }\n }\n\n add(child: V, before: Nullable<V> = null): this {\n // Ensure that this node is not added anywhere else\n if (child.nextSibling != null || child.prevSibling != null) {\n throw new Error(\"New node already added to a list. Remove it first\");\n }\n child.nextSibling = child.prevSibling = null;\n this._size++;\n if (this._firstChild == null || this._lastChild == null) {\n this._firstChild = this._lastChild = child;\n } else if (before == null) {\n child.prevSibling = this._lastChild;\n child.nextSibling = null;\n this._lastChild.nextSibling = child;\n this._lastChild = child;\n } else if (before == this._firstChild) {\n child.nextSibling = before;\n child.prevSibling = null;\n this._firstChild.prevSibling = child;\n this._firstChild = child;\n } else {\n const prev = before.prevSibling;\n child.nextSibling = before;\n before.prevSibling = child;\n child.prevSibling = prev;\n if (prev != null) {\n prev.nextSibling = child;\n }\n }\n return this;\n }\n\n pushFront(value: V): this {\n return this.add(value, this._firstChild);\n }\n\n pushBack(value: V): this {\n return this.add(value);\n }\n\n /**\n * Removes a child node from this list.\n * It is upto the caller to ensure that this node indeed belongs\n * to this list otherwise deletion of a non belonging node could result\n * in undefined behaviour.\n */\n remove(child: V): this {\n const next = child.nextSibling;\n const prev = child.prevSibling;\n\n if (next == null) {\n this._lastChild = prev;\n if (prev == null) this._firstChild = null;\n } else {\n next.prevSibling = prev;\n }\n\n if (prev == null) {\n this._firstChild = next;\n if (next == null) this._lastChild = null;\n } else {\n prev.nextSibling = next;\n }\n\n this._size--;\n\n child.prevSibling = child.nextSibling = null;\n return this;\n }\n\n popBack(): V {\n if (this._lastChild == null) {\n throw new Error(\"No children\");\n }\n const out = this._lastChild;\n this.remove(out);\n return out;\n }\n\n popFront(): V {\n if (this._firstChild == null) {\n throw new Error(\"No children\");\n }\n const out = this._firstChild;\n this.remove(out);\n return out;\n }\n}\n\n/**\n * A list implementation where the values themselves need to be wrapper in a list node.\n * If values already have sibling node properties they can be direclty used\n * via ValueLists.\n */\nexport class List<V> {\n private container: ValueList<MutableListNode<V>>;\n\n constructor(...values: V[]) {\n this.container = new ValueList<MutableListNode<V>>();\n for (const v of values) this.push(v);\n }\n\n toJSON(): V[] {\n return Array.from(this.values());\n }\n\n forEach(method: (val: V) => boolean | any): number {\n return this.container.forEach((v) => method(v.value));\n }\n\n equals(another: List<V>, eqlFunc: (val1: V, val2: V) => boolean): boolean {\n return this.container.equals(another.container, (a, b) => eqlFunc(a.value, b.value));\n }\n\n find(target: V): Nullable<MutableListNode<V>> {\n for (const v of this.container.values()) {\n if (target == v.value) {\n return v;\n }\n }\n return null;\n }\n\n get isEmpty(): boolean {\n return this.container.isEmpty;\n }\n\n get size(): number {\n return this.container.size;\n }\n\n get first(): Nullable<MutableListNode<V>> {\n return this.container.first;\n }\n\n get last(): Nullable<MutableListNode<V>> {\n return this.container.last;\n }\n\n /**\n * Generator of values in reverse order.\n */\n *reversedValues(): Generator<V> {\n for (const v of this.container.reversedValues()) yield v.value;\n }\n\n /**\n * Generator of values in forward order.\n */\n *values(): Generator<V> {\n for (const v of this.container.values()) yield v.value;\n }\n\n popBack(): V {\n return this.container.popBack().value;\n }\n\n popFront(): V {\n return this.container.popFront().value;\n }\n\n pushFront(value: V): this {\n return this.add(value, this.container.first);\n }\n\n push(value: V): this {\n return this.add(value);\n }\n\n add(child: V, before: Nullable<MutableListNode<V>> = null): this {\n this.container.add(new MutableListNode(child), before);\n return this;\n }\n}\n"]}
|
|
@@ -35,10 +35,6 @@ export declare class EventEmitter {
|
|
|
35
35
|
}
|
|
36
36
|
export declare class EventHub {
|
|
37
37
|
private _handlers;
|
|
38
|
-
private _muted;
|
|
39
|
-
get isMuted(): boolean;
|
|
40
|
-
mute(): void;
|
|
41
|
-
unmute(): void;
|
|
42
38
|
on(names: Array<string> | string, callback: EventCallback): this;
|
|
43
39
|
removeOn(names: Array<string> | string, callback: EventCallback): this;
|
|
44
40
|
_ensurestrings(names: Array<string> | string): string[];
|
|
@@ -50,6 +46,12 @@ export declare class EventHub {
|
|
|
50
46
|
}, handler: T): this;
|
|
51
47
|
emit(name: string, source: any, payload?: any): boolean;
|
|
52
48
|
dispatchEvent(event: TEvent): boolean;
|
|
49
|
+
static BATCH_EVENTS: string;
|
|
50
|
+
protected _events: TEvent[];
|
|
51
|
+
protected _inBatchMode: boolean;
|
|
52
|
+
startBatchMode(): this;
|
|
53
|
+
cancelBatch(): void;
|
|
54
|
+
commitBatch(): void;
|
|
53
55
|
}
|
|
54
56
|
export declare class StateMachine {
|
|
55
57
|
private _states;
|
package/lib/esm/comms/events.js
CHANGED
|
@@ -65,16 +65,8 @@ export class EventEmitter {
|
|
|
65
65
|
export class EventHub {
|
|
66
66
|
constructor() {
|
|
67
67
|
this._handlers = {};
|
|
68
|
-
this.
|
|
69
|
-
|
|
70
|
-
get isMuted() {
|
|
71
|
-
return this._muted;
|
|
72
|
-
}
|
|
73
|
-
mute() {
|
|
74
|
-
this._muted = true;
|
|
75
|
-
}
|
|
76
|
-
unmute() {
|
|
77
|
-
this._muted = false;
|
|
68
|
+
this._events = [];
|
|
69
|
+
this._inBatchMode = false;
|
|
78
70
|
}
|
|
79
71
|
on(names, callback) {
|
|
80
72
|
return this._addHandler(names, this._handlers, callback);
|
|
@@ -110,7 +102,14 @@ export class EventHub {
|
|
|
110
102
|
return this;
|
|
111
103
|
}
|
|
112
104
|
emit(name, source, payload) {
|
|
113
|
-
|
|
105
|
+
const evt = new TEvent(name, source, payload);
|
|
106
|
+
if (this._inBatchMode) {
|
|
107
|
+
this._events.push(evt);
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
return this.dispatchEvent(evt);
|
|
112
|
+
}
|
|
114
113
|
}
|
|
115
114
|
dispatchEvent(event) {
|
|
116
115
|
const evtCallbacks = this._handlers[event.name] || [];
|
|
@@ -121,7 +120,23 @@ export class EventHub {
|
|
|
121
120
|
}
|
|
122
121
|
return true;
|
|
123
122
|
}
|
|
123
|
+
startBatchMode() {
|
|
124
|
+
if (!this._inBatchMode) {
|
|
125
|
+
this._inBatchMode = true;
|
|
126
|
+
}
|
|
127
|
+
return this;
|
|
128
|
+
}
|
|
129
|
+
cancelBatch() {
|
|
130
|
+
this._inBatchMode = false;
|
|
131
|
+
this._events = [];
|
|
132
|
+
}
|
|
133
|
+
commitBatch() {
|
|
134
|
+
this._inBatchMode = false;
|
|
135
|
+
this.emit(EventHub.BATCH_EVENTS, this, this._events);
|
|
136
|
+
this._events = [];
|
|
137
|
+
}
|
|
124
138
|
}
|
|
139
|
+
EventHub.BATCH_EVENTS = "BatchEvents";
|
|
125
140
|
export class StateMachine {
|
|
126
141
|
constructor() {
|
|
127
142
|
this._states = {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/comms/events.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable, Timestamp } from \"../types\";\n\n/**\n * Super class of all Events.\n */\nexport class TEvent {\n // Globally unique ID for all events.\n private static counter = 0;\n readonly uuid = TEvent.counter++;\n\n /**\n * The event this event was spawned from (if any).\n */\n protected _spawnedFrom: Nullable<this> = null;\n\n /**\n * Name of the event.\n */\n readonly name: string;\n\n /**\n * Source from which this event is originating.\n */\n readonly source: any;\n\n /**\n * Source state that is set by the source of the event only\n * *it* can use.\n */\n sourceState: any = null;\n\n /**\n * Event specific payload.\n */\n payload: any;\n\n /**\n * Whether the event was cancelled.\n */\n cancelled = false;\n\n /**\n * Timestamp of the event - optional.\n */\n timeStamp: Timestamp = -1;\n\n /**\n * All child events that were spawned from this Event.\n * The parent/spawnedFrom and child event references help us\n * form a call tree/trace of a events as it traverses\n * the system.\n */\n children: TEvent[] = [];\n\n constructor(name: string, source: any, payload?: any) {\n this.name = name;\n this.source = source;\n this.payload = payload;\n }\n\n get spawnedFrom(): Nullable<this> {\n return this._spawnedFrom;\n }\n\n protected setSpawnedFrom(msg: Nullable<this>): void {\n this._spawnedFrom = msg;\n if (msg == null) this._rootEvent = this;\n else this._rootEvent = msg.rootEvent;\n }\n\n spawn(name: string, source: any, payload?: any): TEvent {\n const child = new TEvent(name, source, payload);\n child.setSpawnedFrom(this);\n this.children.push(child);\n return child;\n }\n\n /**\n * The first/root message in the forward chain.\n */\n private _rootEvent: this;\n\n get rootEvent(): this {\n return this._rootEvent as this;\n }\n}\n\nexport class State {\n private static counter = 0;\n stateData: any = null;\n readonly id = State.counter++;\n\n get name(): string {\n return this.constructor.name;\n }\n\n enter(data: any): void {\n this.stateData = data;\n }\n\n handle(event: TEvent): void {\n // todo\n }\n}\n\nexport type EventCallback = ((event: TEvent) => void) | ((event: TEvent) => Promise<void>);\n\nexport class EventEmitter {\n protected _eventHub: EventHub | null;\n constructor() {\n this._eventHub = new EventHub();\n }\n get eventHub(): EventHub | null {\n return this._eventHub;\n }\n set eventHub(hub: EventHub | null) {\n const oldHub = this._eventHub;\n this._eventHub = hub;\n this.eventHubChanged(oldHub);\n }\n protected eventHubChanged(oldHub: EventHub | null): void {\n // Do nothing\n console.log(\"WARNING - EventHub Change Listener not implemented: \", this.constructor.name);\n }\n}\n\nexport class EventHub {\n private _handlers: { [key: string]: Array<EventCallback> } = {};\n private _muted = false;\n\n get isMuted(): boolean {\n return this._muted;\n }\n\n mute(): void {\n this._muted = true;\n }\n\n unmute(): void {\n this._muted = false;\n }\n\n on(names: Array<string> | string, callback: EventCallback): this {\n return this._addHandler(names, this._handlers, callback);\n }\n\n removeOn(names: Array<string> | string, callback: EventCallback): this {\n return this._removeHandler(names, this._handlers, callback);\n }\n\n _ensurestrings(names: Array<string> | string): string[] {\n if (typeof names === \"string\") {\n names = (names as string).split(\",\");\n }\n return names.map(function (v) {\n return v.trim();\n });\n }\n\n _addHandler<T>(names: Array<string> | string, handlerlist: { [key: string]: Array<T> }, handler: T): this {\n this._ensurestrings(names).forEach(function (name) {\n handlerlist[name] = handlerlist[name] || [];\n handlerlist[name].push(handler);\n });\n return this;\n }\n\n _removeHandler<T>(names: Array<string> | string, handlerlist: { [key: string]: Array<T> }, handler: T): this {\n this._ensurestrings(names).forEach(function (name) {\n const evHandlers = handlerlist[name] || [];\n for (let i = 0; i < evHandlers.length; i++) {\n if (evHandlers[i] == handler) {\n evHandlers.splice(i, 1);\n break;\n }\n }\n });\n return this;\n }\n\n emit(name: string, source: any, payload?: any): boolean {\n return this.dispatchEvent(new TEvent(name, source, payload));\n }\n\n dispatchEvent(event: TEvent): boolean {\n const evtCallbacks = this._handlers[event.name] || [];\n for (const callback of evtCallbacks) {\n callback(event);\n if (event.cancelled) return false;\n }\n return true;\n }\n}\n\n/**\n * StateMachines allow declarative and stateful chaining of events.\n */\nexport class StateMachine {\n private _states: { [key: string]: State } = {};\n private _rootState: Nullable<State> = null;\n private _currentState: Nullable<State> = null;\n constructor() {\n this._states = {};\n this._rootState = null;\n this._currentState = null;\n }\n\n /**\n * The starting/root state of the machine.\n *\n * @param {String} name Name of the default/root state.\n */\n set rootState(name: string) {\n this._rootState = this.getState(name);\n if (this._currentState == null) {\n this._currentState = this._rootState;\n }\n }\n\n /**\n * Exits the current state (if any) and enters a new state.\n *\n * @param {String} state Name of the new state to enter.\n * @param {Object} data State specific data for the state handler to use for the new state.\n */\n enter(state: string, data: any = null): void {\n if (state == \"\") {\n this._currentState = this._rootState;\n } else {\n this._currentState = this.getState(state);\n }\n if (this._currentState != null) {\n this._currentState.enter(data);\n }\n }\n\n /**\n * Get the state by name.\n *\n * @param {String} name Name of the state being queried.\n * @returns {State} State object associated with the name.\n */\n getState(name: string): State {\n if (!(name in this._states)) {\n throw Error(\"State '\" + name + \"' not yet registered.\");\n }\n return this._states[name];\n }\n\n /**\n * Register a new state in the state machine.\n *\n * @param {State} state State being registered. If another State with\n * the same name exists, then a {DuplicateError} is thrown.\n * @param {Bool} isRoot Whether the new state is a root state.\n */\n registerState(state: State, isRoot = false): void {\n const name = state.name;\n if (name in this._states) {\n throw Error(\"State '\" + name + \"' already registered.\");\n }\n this._states[name] = state;\n if (isRoot || false) {\n this.rootState = state.name;\n }\n }\n\n /**\n * Handles an event from the current state in the state machine possibly resulting in a state transition.\n *\n * @param {Object} name Type of event being sent.\n * @param {EventSource} source The source generating the event.\n * @param {Object} data The event specific data.\n */\n handle(event: TEvent): void {\n if (this._currentState == null) return;\n\n const nextState: any = this._currentState.handle(event);\n if (nextState != null) {\n if (nextState == \"\") {\n if (this._rootState != null) {\n this.enter(this._rootState.name);\n } else {\n throw new Error(\"Root state has not been set\");\n }\n } else {\n this.enter(nextState);\n }\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/comms/events.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable, Timestamp } from \"../types\";\n\n/**\n * Super class of all Events.\n */\nexport class TEvent {\n // Globally unique ID for all events.\n private static counter = 0;\n readonly uuid = TEvent.counter++;\n\n /**\n * The event this event was spawned from (if any).\n */\n protected _spawnedFrom: Nullable<this> = null;\n\n /**\n * Name of the event.\n */\n readonly name: string;\n\n /**\n * Source from which this event is originating.\n */\n readonly source: any;\n\n /**\n * Source state that is set by the source of the event only\n * *it* can use.\n */\n sourceState: any = null;\n\n /**\n * Event specific payload.\n */\n payload: any;\n\n /**\n * Whether the event was cancelled.\n */\n cancelled = false;\n\n /**\n * Timestamp of the event - optional.\n */\n timeStamp: Timestamp = -1;\n\n /**\n * All child events that were spawned from this Event.\n * The parent/spawnedFrom and child event references help us\n * form a call tree/trace of a events as it traverses\n * the system.\n */\n children: TEvent[] = [];\n\n constructor(name: string, source: any, payload?: any) {\n this.name = name;\n this.source = source;\n this.payload = payload;\n }\n\n get spawnedFrom(): Nullable<this> {\n return this._spawnedFrom;\n }\n\n protected setSpawnedFrom(msg: Nullable<this>): void {\n this._spawnedFrom = msg;\n if (msg == null) this._rootEvent = this;\n else this._rootEvent = msg.rootEvent;\n }\n\n spawn(name: string, source: any, payload?: any): TEvent {\n const child = new TEvent(name, source, payload);\n child.setSpawnedFrom(this);\n this.children.push(child);\n return child;\n }\n\n /**\n * The first/root message in the forward chain.\n */\n private _rootEvent: this;\n\n get rootEvent(): this {\n return this._rootEvent as this;\n }\n}\n\nexport class State {\n private static counter = 0;\n stateData: any = null;\n readonly id = State.counter++;\n\n get name(): string {\n return this.constructor.name;\n }\n\n enter(data: any): void {\n this.stateData = data;\n }\n\n handle(event: TEvent): void {\n // todo\n }\n}\n\nexport type EventCallback = ((event: TEvent) => void) | ((event: TEvent) => Promise<void>);\n\nexport class EventEmitter {\n protected _eventHub: EventHub | null;\n constructor() {\n this._eventHub = new EventHub();\n }\n get eventHub(): EventHub | null {\n return this._eventHub;\n }\n set eventHub(hub: EventHub | null) {\n const oldHub = this._eventHub;\n this._eventHub = hub;\n this.eventHubChanged(oldHub);\n }\n protected eventHubChanged(oldHub: EventHub | null): void {\n // Do nothing\n console.log(\"WARNING - EventHub Change Listener not implemented: \", this.constructor.name);\n }\n}\n\nexport class EventHub {\n private _handlers: { [key: string]: Array<EventCallback> } = {};\n\n on(names: Array<string> | string, callback: EventCallback): this {\n return this._addHandler(names, this._handlers, callback);\n }\n\n removeOn(names: Array<string> | string, callback: EventCallback): this {\n return this._removeHandler(names, this._handlers, callback);\n }\n\n _ensurestrings(names: Array<string> | string): string[] {\n if (typeof names === \"string\") {\n names = (names as string).split(\",\");\n }\n return names.map(function (v) {\n return v.trim();\n });\n }\n\n _addHandler<T>(names: Array<string> | string, handlerlist: { [key: string]: Array<T> }, handler: T): this {\n this._ensurestrings(names).forEach(function (name) {\n handlerlist[name] = handlerlist[name] || [];\n handlerlist[name].push(handler);\n });\n return this;\n }\n\n _removeHandler<T>(names: Array<string> | string, handlerlist: { [key: string]: Array<T> }, handler: T): this {\n this._ensurestrings(names).forEach(function (name) {\n const evHandlers = handlerlist[name] || [];\n for (let i = 0; i < evHandlers.length; i++) {\n if (evHandlers[i] == handler) {\n evHandlers.splice(i, 1);\n break;\n }\n }\n });\n return this;\n }\n\n emit(name: string, source: any, payload?: any): boolean {\n const evt = new TEvent(name, source, payload);\n if (this._inBatchMode) {\n this._events.push(evt);\n return true;\n } else {\n return this.dispatchEvent(evt);\n }\n }\n\n dispatchEvent(event: TEvent): boolean {\n const evtCallbacks = this._handlers[event.name] || [];\n for (const callback of evtCallbacks) {\n callback(event);\n if (event.cancelled) return false;\n }\n return true;\n }\n\n // Support for transactional/batch event handling, where\n // the user can allow a bunch of events to first collect\n // before triggering a batch dispatch\n public static BATCH_EVENTS = \"BatchEvents\";\n protected _events: TEvent[] = [];\n protected _inBatchMode = false;\n startBatchMode(): this {\n if (!this._inBatchMode) {\n this._inBatchMode = true;\n }\n return this;\n }\n\n cancelBatch(): void {\n this._inBatchMode = false;\n this._events = [];\n }\n\n commitBatch(): void {\n this._inBatchMode = false;\n this.emit(EventHub.BATCH_EVENTS, this, this._events);\n this._events = [];\n }\n}\n\n/**\n * StateMachines allow declarative and stateful chaining of events.\n */\nexport class StateMachine {\n private _states: { [key: string]: State } = {};\n private _rootState: Nullable<State> = null;\n private _currentState: Nullable<State> = null;\n constructor() {\n this._states = {};\n this._rootState = null;\n this._currentState = null;\n }\n\n /**\n * The starting/root state of the machine.\n *\n * @param {String} name Name of the default/root state.\n */\n set rootState(name: string) {\n this._rootState = this.getState(name);\n if (this._currentState == null) {\n this._currentState = this._rootState;\n }\n }\n\n /**\n * Exits the current state (if any) and enters a new state.\n *\n * @param {String} state Name of the new state to enter.\n * @param {Object} data State specific data for the state handler to use for the new state.\n */\n enter(state: string, data: any = null): void {\n if (state == \"\") {\n this._currentState = this._rootState;\n } else {\n this._currentState = this.getState(state);\n }\n if (this._currentState != null) {\n this._currentState.enter(data);\n }\n }\n\n /**\n * Get the state by name.\n *\n * @param {String} name Name of the state being queried.\n * @returns {State} State object associated with the name.\n */\n getState(name: string): State {\n if (!(name in this._states)) {\n throw Error(\"State '\" + name + \"' not yet registered.\");\n }\n return this._states[name];\n }\n\n /**\n * Register a new state in the state machine.\n *\n * @param {State} state State being registered. If another State with\n * the same name exists, then a {DuplicateError} is thrown.\n * @param {Bool} isRoot Whether the new state is a root state.\n */\n registerState(state: State, isRoot = false): void {\n const name = state.name;\n if (name in this._states) {\n throw Error(\"State '\" + name + \"' already registered.\");\n }\n this._states[name] = state;\n if (isRoot || false) {\n this.rootState = state.name;\n }\n }\n\n /**\n * Handles an event from the current state in the state machine possibly resulting in a state transition.\n *\n * @param {Object} name Type of event being sent.\n * @param {EventSource} source The source generating the event.\n * @param {Object} data The event specific data.\n */\n handle(event: TEvent): void {\n if (this._currentState == null) return;\n\n const nextState: any = this._currentState.handle(event);\n if (nextState != null) {\n if (nextState == \"\") {\n if (this._rootState != null) {\n this.enter(this._rootState.name);\n } else {\n throw new Error(\"Root state has not been set\");\n }\n } else {\n this.enter(nextState);\n }\n }\n }\n}\n"]}
|
package/lib/esm/list.d.ts
CHANGED
|
@@ -23,12 +23,12 @@ export declare class ValueList<V extends ListNode<V>> {
|
|
|
23
23
|
get last(): Nullable<V>;
|
|
24
24
|
reversedValues(): Generator<V>;
|
|
25
25
|
values(): Generator<V>;
|
|
26
|
-
popBack(): V;
|
|
27
|
-
popFront(): V;
|
|
28
26
|
add(child: V, before?: Nullable<V>): this;
|
|
29
27
|
pushFront(value: V): this;
|
|
30
|
-
|
|
28
|
+
pushBack(value: V): this;
|
|
31
29
|
remove(child: V): this;
|
|
30
|
+
popBack(): V;
|
|
31
|
+
popFront(): V;
|
|
32
32
|
}
|
|
33
33
|
export declare class List<V> {
|
|
34
34
|
private container;
|
package/lib/esm/list.js
CHANGED
|
@@ -11,7 +11,7 @@ export class ValueList {
|
|
|
11
11
|
this._lastChild = null;
|
|
12
12
|
this._size = 0;
|
|
13
13
|
for (const v of values)
|
|
14
|
-
this.
|
|
14
|
+
this.pushBack(v);
|
|
15
15
|
}
|
|
16
16
|
toJSON() {
|
|
17
17
|
return Array.from(this.values());
|
|
@@ -66,38 +66,6 @@ export class ValueList {
|
|
|
66
66
|
tmp = tmp.nextSibling;
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
|
-
popBack() {
|
|
70
|
-
if (this._lastChild == null) {
|
|
71
|
-
throw new Error("No children");
|
|
72
|
-
}
|
|
73
|
-
const out = this._lastChild;
|
|
74
|
-
const prev = this._lastChild.prevSibling;
|
|
75
|
-
this._size--;
|
|
76
|
-
if (prev == null) {
|
|
77
|
-
this._firstChild = this._lastChild = null;
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
prev.nextSibling = null;
|
|
81
|
-
this._lastChild = prev;
|
|
82
|
-
}
|
|
83
|
-
return out;
|
|
84
|
-
}
|
|
85
|
-
popFront() {
|
|
86
|
-
if (this._firstChild == null) {
|
|
87
|
-
throw new Error("No children");
|
|
88
|
-
}
|
|
89
|
-
const out = this._firstChild;
|
|
90
|
-
const next = this._firstChild.nextSibling;
|
|
91
|
-
this._size--;
|
|
92
|
-
if (next == null) {
|
|
93
|
-
this._firstChild = this._lastChild = null;
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
next.prevSibling = null;
|
|
97
|
-
this._firstChild = next;
|
|
98
|
-
}
|
|
99
|
-
return out;
|
|
100
|
-
}
|
|
101
69
|
add(child, before = null) {
|
|
102
70
|
if (child.nextSibling != null || child.prevSibling != null) {
|
|
103
71
|
throw new Error("New node already added to a list. Remove it first");
|
|
@@ -133,7 +101,7 @@ export class ValueList {
|
|
|
133
101
|
pushFront(value) {
|
|
134
102
|
return this.add(value, this._firstChild);
|
|
135
103
|
}
|
|
136
|
-
|
|
104
|
+
pushBack(value) {
|
|
137
105
|
return this.add(value);
|
|
138
106
|
}
|
|
139
107
|
remove(child) {
|
|
@@ -155,11 +123,26 @@ export class ValueList {
|
|
|
155
123
|
else {
|
|
156
124
|
prev.nextSibling = next;
|
|
157
125
|
}
|
|
158
|
-
|
|
159
|
-
this._size--;
|
|
126
|
+
this._size--;
|
|
160
127
|
child.prevSibling = child.nextSibling = null;
|
|
161
128
|
return this;
|
|
162
129
|
}
|
|
130
|
+
popBack() {
|
|
131
|
+
if (this._lastChild == null) {
|
|
132
|
+
throw new Error("No children");
|
|
133
|
+
}
|
|
134
|
+
const out = this._lastChild;
|
|
135
|
+
this.remove(out);
|
|
136
|
+
return out;
|
|
137
|
+
}
|
|
138
|
+
popFront() {
|
|
139
|
+
if (this._firstChild == null) {
|
|
140
|
+
throw new Error("No children");
|
|
141
|
+
}
|
|
142
|
+
const out = this._firstChild;
|
|
143
|
+
this.remove(out);
|
|
144
|
+
return out;
|
|
145
|
+
}
|
|
163
146
|
}
|
|
164
147
|
export class List {
|
|
165
148
|
constructor(...values) {
|
package/lib/esm/list.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/list.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable } from \"./types\";\n\nexport interface ListNode<V> {\n nextSibling: Nullable<V>;\n prevSibling: Nullable<V>;\n}\n\nclass MutableListNode<V> implements ListNode<MutableListNode<V>> {\n nextSibling: Nullable<MutableListNode<V>> = null;\n prevSibling: Nullable<MutableListNode<V>> = null;\n constructor(public value: V) {}\n}\n\n/**\n * A list implementation where the value itself contains next and prev pointers\n * so we do not need to create wrapper classes.\n */\nexport class ValueList<V extends ListNode<V>> {\n protected _firstChild: Nullable<V> = null;\n protected _lastChild: Nullable<V> = null;\n protected _size = 0;\n\n constructor(...values: V[]) {\n for (const v of values) this.push(v);\n }\n\n toJSON(): V[] {\n return Array.from(this.values());\n }\n\n forEach(method: (val: V) => boolean | any): number {\n let tmp: V | null = this._firstChild;\n let count = 0;\n while (tmp != null) {\n if (method(tmp) == false) {\n break;\n }\n count++;\n tmp = tmp.nextSibling;\n }\n return count;\n }\n\n equals(another: ValueList<V>, eqlFunc: (val1: V, val2: V) => boolean): boolean {\n if (this.size != another.size) return false;\n let tmp = this.first;\n let tmp2 = another.first;\n for (; tmp != null && tmp2 != null; tmp = tmp.nextSibling, tmp2 = tmp2.nextSibling) {\n if (!eqlFunc(tmp, tmp2)) {\n return false;\n }\n }\n return tmp == null && tmp2 == null;\n }\n\n get isEmpty(): boolean {\n return this._size == 0;\n }\n\n get size(): number {\n return this._size;\n }\n\n get first(): Nullable<V> {\n return this._firstChild;\n }\n\n get last(): Nullable<V> {\n return this._lastChild;\n }\n\n /**\n * Generator of values in reverse order.\n */\n *reversedValues(): Generator<V> {\n let tmp = this._lastChild;\n while (tmp != null) {\n yield tmp;\n tmp = tmp.prevSibling;\n }\n }\n\n /**\n * Generator of values in forward order.\n */\n *values(): Generator<V> {\n let tmp = this._firstChild;\n while (tmp != null) {\n yield tmp;\n tmp = tmp.nextSibling;\n }\n }\n\n popBack(): V {\n if (this._lastChild == null) {\n throw new Error(\"No children\");\n }\n const out = this._lastChild;\n const prev = this._lastChild.prevSibling;\n this._size--;\n if (prev == null) {\n this._firstChild = this._lastChild = null;\n } else {\n prev.nextSibling = null;\n this._lastChild = prev;\n }\n return out;\n }\n\n popFront(): V {\n if (this._firstChild == null) {\n throw new Error(\"No children\");\n }\n const out = this._firstChild;\n const next = this._firstChild.nextSibling;\n this._size--;\n if (next == null) {\n this._firstChild = this._lastChild = null;\n } else {\n next.prevSibling = null;\n this._firstChild = next;\n }\n return out;\n }\n\n add(child: V, before: Nullable<V> = null): this {\n // Ensure that this node is not added anywhere else\n if (child.nextSibling != null || child.prevSibling != null) {\n throw new Error(\"New node already added to a list. Remove it first\");\n }\n child.nextSibling = child.prevSibling = null;\n this._size++;\n if (this._firstChild == null || this._lastChild == null) {\n this._firstChild = this._lastChild = child;\n } else if (before == null) {\n child.prevSibling = this._lastChild;\n child.nextSibling = null;\n this._lastChild.nextSibling = child;\n this._lastChild = child;\n } else if (before == this._firstChild) {\n child.nextSibling = before;\n child.prevSibling = null;\n this._firstChild.prevSibling = child;\n this._firstChild = child;\n } else {\n const prev = before.prevSibling;\n child.nextSibling = before;\n before.prevSibling = child;\n child.prevSibling = prev;\n if (prev != null) {\n prev.nextSibling = child;\n }\n }\n return this;\n }\n\n pushFront(value: V): this {\n return this.add(value, this._firstChild);\n }\n\n push(value: V): this {\n return this.add(value);\n }\n\n /**\n * Removes a child node from this list.\n * It is upto the caller to ensure that this node indeed belongs\n * to this list otherwise deletion of a non belonging node could result\n * in undefined behaviour.\n */\n remove(child: V): this {\n const next = child.nextSibling;\n const prev = child.prevSibling;\n\n if (next == null) {\n this._lastChild = prev;\n if (prev == null) this._firstChild = null;\n } else {\n next.prevSibling = prev;\n }\n\n if (prev == null) {\n this._firstChild = next;\n if (next == null) this._lastChild = null;\n } else {\n prev.nextSibling = next;\n }\n\n if (next != null || prev != null) this._size--;\n\n child.prevSibling = child.nextSibling = null;\n return this;\n }\n}\n\n/**\n * A list implementation where the values themselves need to be wrapper in a list node.\n * If values already have sibling node properties they can be direclty used\n * via ValueLists.\n */\nexport class List<V> {\n private container: ValueList<MutableListNode<V>>;\n\n constructor(...values: V[]) {\n this.container = new ValueList<MutableListNode<V>>();\n for (const v of values) this.push(v);\n }\n\n toJSON(): V[] {\n return Array.from(this.values());\n }\n\n forEach(method: (val: V) => boolean | any): number {\n return this.container.forEach((v) => method(v.value));\n }\n\n equals(another: List<V>, eqlFunc: (val1: V, val2: V) => boolean): boolean {\n return this.container.equals(another.container, (a, b) => eqlFunc(a.value, b.value));\n }\n\n find(target: V): Nullable<MutableListNode<V>> {\n for (const v of this.container.values()) {\n if (target == v.value) {\n return v;\n }\n }\n return null;\n }\n\n get isEmpty(): boolean {\n return this.container.isEmpty;\n }\n\n get size(): number {\n return this.container.size;\n }\n\n get first(): Nullable<MutableListNode<V>> {\n return this.container.first;\n }\n\n get last(): Nullable<MutableListNode<V>> {\n return this.container.last;\n }\n\n /**\n * Generator of values in reverse order.\n */\n *reversedValues(): Generator<V> {\n for (const v of this.container.reversedValues()) yield v.value;\n }\n\n /**\n * Generator of values in forward order.\n */\n *values(): Generator<V> {\n for (const v of this.container.values()) yield v.value;\n }\n\n popBack(): V {\n return this.container.popBack().value;\n }\n\n popFront(): V {\n return this.container.popFront().value;\n }\n\n pushFront(value: V): this {\n return this.add(value, this.container.first);\n }\n\n push(value: V): this {\n return this.add(value);\n }\n\n add(child: V, before: Nullable<MutableListNode<V>> = null): this {\n this.container.add(new MutableListNode(child), before);\n return this;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/list.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable } from \"./types\";\n\nexport interface ListNode<V> {\n nextSibling: Nullable<V>;\n prevSibling: Nullable<V>;\n}\n\nclass MutableListNode<V> implements ListNode<MutableListNode<V>> {\n nextSibling: Nullable<MutableListNode<V>> = null;\n prevSibling: Nullable<MutableListNode<V>> = null;\n constructor(public value: V) {}\n}\n\n/**\n * A list implementation where the value itself contains next and prev pointers\n * so we do not need to create wrapper classes.\n */\nexport class ValueList<V extends ListNode<V>> {\n protected _firstChild: Nullable<V> = null;\n protected _lastChild: Nullable<V> = null;\n protected _size = 0;\n\n constructor(...values: V[]) {\n for (const v of values) this.pushBack(v);\n }\n\n toJSON(): V[] {\n return Array.from(this.values());\n }\n\n forEach(method: (val: V) => boolean | any): number {\n let tmp: V | null = this._firstChild;\n let count = 0;\n while (tmp != null) {\n if (method(tmp) == false) {\n break;\n }\n count++;\n tmp = tmp.nextSibling;\n }\n return count;\n }\n\n equals(another: ValueList<V>, eqlFunc: (val1: V, val2: V) => boolean): boolean {\n if (this.size != another.size) return false;\n let tmp = this.first;\n let tmp2 = another.first;\n for (; tmp != null && tmp2 != null; tmp = tmp.nextSibling, tmp2 = tmp2.nextSibling) {\n if (!eqlFunc(tmp, tmp2)) {\n return false;\n }\n }\n return tmp == null && tmp2 == null;\n }\n\n get isEmpty(): boolean {\n return this._size == 0;\n }\n\n get size(): number {\n return this._size;\n }\n\n get first(): Nullable<V> {\n return this._firstChild;\n }\n\n get last(): Nullable<V> {\n return this._lastChild;\n }\n\n /**\n * Generator of values in reverse order.\n */\n *reversedValues(): Generator<V> {\n let tmp = this._lastChild;\n while (tmp != null) {\n yield tmp;\n tmp = tmp.prevSibling;\n }\n }\n\n /**\n * Generator of values in forward order.\n */\n *values(): Generator<V> {\n let tmp = this._firstChild;\n while (tmp != null) {\n yield tmp;\n tmp = tmp.nextSibling;\n }\n }\n\n add(child: V, before: Nullable<V> = null): this {\n // Ensure that this node is not added anywhere else\n if (child.nextSibling != null || child.prevSibling != null) {\n throw new Error(\"New node already added to a list. Remove it first\");\n }\n child.nextSibling = child.prevSibling = null;\n this._size++;\n if (this._firstChild == null || this._lastChild == null) {\n this._firstChild = this._lastChild = child;\n } else if (before == null) {\n child.prevSibling = this._lastChild;\n child.nextSibling = null;\n this._lastChild.nextSibling = child;\n this._lastChild = child;\n } else if (before == this._firstChild) {\n child.nextSibling = before;\n child.prevSibling = null;\n this._firstChild.prevSibling = child;\n this._firstChild = child;\n } else {\n const prev = before.prevSibling;\n child.nextSibling = before;\n before.prevSibling = child;\n child.prevSibling = prev;\n if (prev != null) {\n prev.nextSibling = child;\n }\n }\n return this;\n }\n\n pushFront(value: V): this {\n return this.add(value, this._firstChild);\n }\n\n pushBack(value: V): this {\n return this.add(value);\n }\n\n /**\n * Removes a child node from this list.\n * It is upto the caller to ensure that this node indeed belongs\n * to this list otherwise deletion of a non belonging node could result\n * in undefined behaviour.\n */\n remove(child: V): this {\n const next = child.nextSibling;\n const prev = child.prevSibling;\n\n if (next == null) {\n this._lastChild = prev;\n if (prev == null) this._firstChild = null;\n } else {\n next.prevSibling = prev;\n }\n\n if (prev == null) {\n this._firstChild = next;\n if (next == null) this._lastChild = null;\n } else {\n prev.nextSibling = next;\n }\n\n this._size--;\n\n child.prevSibling = child.nextSibling = null;\n return this;\n }\n\n popBack(): V {\n if (this._lastChild == null) {\n throw new Error(\"No children\");\n }\n const out = this._lastChild;\n this.remove(out);\n return out;\n }\n\n popFront(): V {\n if (this._firstChild == null) {\n throw new Error(\"No children\");\n }\n const out = this._firstChild;\n this.remove(out);\n return out;\n }\n}\n\n/**\n * A list implementation where the values themselves need to be wrapper in a list node.\n * If values already have sibling node properties they can be direclty used\n * via ValueLists.\n */\nexport class List<V> {\n private container: ValueList<MutableListNode<V>>;\n\n constructor(...values: V[]) {\n this.container = new ValueList<MutableListNode<V>>();\n for (const v of values) this.push(v);\n }\n\n toJSON(): V[] {\n return Array.from(this.values());\n }\n\n forEach(method: (val: V) => boolean | any): number {\n return this.container.forEach((v) => method(v.value));\n }\n\n equals(another: List<V>, eqlFunc: (val1: V, val2: V) => boolean): boolean {\n return this.container.equals(another.container, (a, b) => eqlFunc(a.value, b.value));\n }\n\n find(target: V): Nullable<MutableListNode<V>> {\n for (const v of this.container.values()) {\n if (target == v.value) {\n return v;\n }\n }\n return null;\n }\n\n get isEmpty(): boolean {\n return this.container.isEmpty;\n }\n\n get size(): number {\n return this.container.size;\n }\n\n get first(): Nullable<MutableListNode<V>> {\n return this.container.first;\n }\n\n get last(): Nullable<MutableListNode<V>> {\n return this.container.last;\n }\n\n /**\n * Generator of values in reverse order.\n */\n *reversedValues(): Generator<V> {\n for (const v of this.container.reversedValues()) yield v.value;\n }\n\n /**\n * Generator of values in forward order.\n */\n *values(): Generator<V> {\n for (const v of this.container.values()) yield v.value;\n }\n\n popBack(): V {\n return this.container.popBack().value;\n }\n\n popFront(): V {\n return this.container.popFront().value;\n }\n\n pushFront(value: V): this {\n return this.add(value, this.container.first);\n }\n\n push(value: V): this {\n return this.add(value);\n }\n\n add(child: V, before: Nullable<MutableListNode<V>> = null): this {\n this.container.add(new MutableListNode(child), before);\n return this;\n }\n}\n"]}
|