delphirtl
Version:
RTL functions from Delphi
415 lines • 18.4 kB
JavaScript
"use strict";
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var _Queue_store, _Stack_store;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SEmptyIterables = exports.List = exports.Stack = exports.TreeNode = exports.Tree = exports.Dictionary = exports.Queue = void 0;
const node_assert_1 = require("node:assert");
/**
* A first in, first out class
* @category Collections
*/
class Queue {
constructor() {
_Queue_store.set(this, []);
}
/**
*
* @param val Puts the given value into the class
*/
push(val) {
__classPrivateFieldGet(this, _Queue_store, "f").push(val);
}
/**
*
* @returns The first value in the store
*/
pop() {
return this.next();
}
/**
*
* @returns The first value in the store
*/
next() {
const result = __classPrivateFieldGet(this, _Queue_store, "f").shift();
return result;
}
/**
* The number of values in the store
*
* @readonly
* @type {number}
*/
get length() {
return __classPrivateFieldGet(this, _Queue_store, "f").length;
}
}
exports.Queue = Queue;
_Queue_store = new WeakMap();
/**
* A last in, first out class
*
* @class Stack
* @typedef {Stack}
* @template T
* @category Collections
*/
class Stack {
constructor() {
_Stack_store.set(this, []);
}
/**
*
* @param v Puts the given value into the store
*/
push(v) {
__classPrivateFieldGet(this, _Stack_store, "f").push(v);
}
/**
*
* @returns The last value that was pushed into the store
*/
pop() {
const result = __classPrivateFieldGet(this, _Stack_store, "f").pop();
return result;
}
/**
* The number of items in the store
*
* @readonly
* @type {number}
*/
get length() {
return __classPrivateFieldGet(this, _Stack_store, "f").length;
}
}
exports.Stack = Stack;
_Stack_store = new WeakMap();
/**
* Dictionary
*
* @class Dictionary
* @typedef {Dictionary}
* @template K
* @template V
* @extends {Map<K, V>}
* @category Collections
*/
class Dictionary extends Map {
/**
* Sets the specified value for the given key.
* @param key
* @param value
*/
AddOrSetValue(key, value) {
this.Add(key, value);
}
/**
* Sets the specified value for the given key.
* @param key
* @param value
*/
Add(key, value) {
this.set(key, value);
}
/**
* Clears the dictionary of all data
*/
Clear() {
this.clear();
}
/**
* Gets the number of keys and values stored.
*
* @public
* @readonly
* @type {number}
*/
get Count() {
const result = this.size;
return result;
}
/**
* Gets the number of keys and values stored.
*
* @public
* @readonly
* @type {number}
*/
get count() { return this.Count; }
/**
* Gets the keys and values stored in the Dictionary
*
* @public
* @readonly
* @type {{ [key: string]: V }}
*/
get Items() {
const items = {};
this.forEach((value, key) => {
items[key] = value;
});
// in-place of returning items
// the following will intercept non-existent indices and
// throw an Error
// Unfortunately, can't declare a class within a class
// so, there's the repeated definition of { [key...]: V }
return new Proxy(items, {
// Intercept 'get' operation
get: (map, key) => {
let k = key.toString();
if (!this.has(k)) {
throw new Error(`Key "${key}" not found.`);
}
return this.get(k);
},
// Intercept 'set' operation
set: (map, key, value) => {
let k = key.toString();
this.set(k, value);
return true;
}
});
}
/**
* Gets all items
*
* @public
* @readonly
* @type {{ [key: string]: V }}
*/
get items() {
const result = this.Items;
return result;
}
/**
* Returns a boolean, which, if true, means value has valid information.
*
* @param {K} key
* @returns {{
* found: boolean,
* value: V | undefined
* }}
*/
TryGetValue(key) {
const value = this.get(key);
const found = value !== undefined;
const result = { found, value };
return result;
}
/**
* Returns true if the dictionary has the specified key, false if not.
*
* @param {K} key
* @returns {boolean}
*/
Contains(key) {
const result = this.has(key);
return result;
}
/**
* Returns true if the dictionary contains the given value.
*
* @param {V} value
* @returns {boolean}
*/
ContainsValue(value) {
for (const v of this.values()) {
if (value === v) {
return true;
}
}
return false;
}
/**
* Adds the given key and value
*
* @param {K} key
* @param {V} value
* @returns {boolean}
*/
TryAdd(key, value) {
this.set(key, value);
return true;
}
/**
* Removes the given key and its value.
*
* @param {K} key
*/
Remove(key) {
this.delete(key);
}
}
exports.Dictionary = Dictionary;
;
/**
* TreeNode
*
* @class TreeNode
* @typedef {TreeNode}
* @template T
* @category Collections
*/
class TreeNode {
constructor(value) {
this.data = value;
this.left = null;
this.right = null;
}
static createTree(nodeValues) {
let root = null;
// ensure iterables have at least 1 value
let count = 0;
for (const nodeValue of nodeValues) {
count++;
break;
}
(0, node_assert_1.strict)(count > 0, SEmptyIterables);
for (const nodeValue of nodeValues) {
root = insertNode(root, nodeValue);
}
return root;
}
// should only be called when this is the root, otherwise, it'll return the wrong values
/**
* Returns the height of the tree. Call only when this is the root.
*
* @public
* @readonly
* @type {number} height of the tree
*/
get height() {
return height(this);
}
}
exports.Tree = TreeNode;
exports.TreeNode = TreeNode;
function insertNode(node, data) {
if (node === null)
return new TreeNode(data);
if (data < node.data) {
node.left = insertNode(node.left, data);
}
else {
node.right = insertNode(node.right, data);
}
return node;
}
const SEmptyIterables = "Iterable do not have any elements!";
exports.SEmptyIterables = SEmptyIterables;
function createTree(nodeValues) {
let root = null;
// ensure iterables have at least 1 value
let count = 0;
for (const nodeValue of nodeValues) {
count++;
break;
}
(0, node_assert_1.strict)(count > 0, SEmptyIterables);
for (const nodeValue of nodeValues) {
root = insertNode(root, nodeValue);
}
return root;
}
// see https://www.baeldung.com/cs/binary-tree-height
function height(root) {
if (root === null) {
return -1;
}
const result = 1 + Math.max(height(root.left), height(root.right));
return result;
}
/**
* List
*
* @class List
* @typedef {List}
* @template T
* @category Collections
*/
class List {
find(callback) {
const result = this.items.find((value, index, obj) => {
const result = (value == callback);
return result;
});
return result !== undefined;
}
constructor() {
this.items = [];
}
/**
*
* @returns Size of the List
*/
size() {
return this.items.length;
}
/**
* Returns the length of this list
*
* @public
* @readonly
* @type {number}
*/
get length() {
return this.items.length;
}
/**
* Adds a value to the list
* @param value The value to add to the list
*/
add(value) {
this.items.push(value);
}
indexOf(value) {
const result = this.items.indexOf(value);
return result;
}
get(index) {
return this.items[index];
}
/**
* Delete a specified value
*
* @type {*}
*/
delete(value) {
const index = this.items.indexOf(value);
if (index !== -1) {
this.items.splice(index, 1);
return true;
}
return false;
}
/**
* Removes the specified value
* @param value
* @returns
*/
remove(value) {
return this.delete(value);
}
// Implementing the iterator
[Symbol.iterator]() {
let index = 0;
const items = this.items;
return {
next() {
if (index < items.length) {
return { value: items[index++], done: false };
}
else {
return { value: undefined, done: true };
}
}
};
}
}
exports.List = List;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29sbGVjdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsNkNBQStDO0FBRS9DOzs7R0FHRztBQUNILE1BQU0sS0FBSztJQUFYO1FBQ0ksdUJBQWMsRUFBRSxFQUFDO0lBcUNyQixDQUFDO0lBbkNHOzs7T0FHRztJQUNILElBQUksQ0FBQyxHQUFNO1FBQ1AsdUJBQUEsSUFBSSxvQkFBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsR0FBRztRQUNDLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFJO1FBQ0EsTUFBTSxNQUFNLEdBQUcsdUJBQUEsSUFBSSxvQkFBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ25DLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFHRDs7Ozs7T0FLRztJQUNILElBQUksTUFBTTtRQUNOLE9BQU8sdUJBQUEsSUFBSSxvQkFBTyxDQUFDLE1BQU0sQ0FBQztJQUM5QixDQUFDO0NBQ0o7QUF5Wkcsc0JBQUs7O0FBdFpUOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLEtBQUs7SUFBWDtRQUNJLHVCQUFjLEVBQUUsRUFBQztJQTZCckIsQ0FBQztJQTNCRzs7O09BR0c7SUFDSCxJQUFJLENBQUMsQ0FBSTtRQUNMLHVCQUFBLElBQUksb0JBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILEdBQUc7UUFDQyxNQUFNLE1BQU0sR0FBRyx1QkFBQSxJQUFJLG9CQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDakMsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUdEOzs7OztPQUtHO0lBQ0gsSUFBSSxNQUFNO1FBQ04sT0FBTyx1QkFBQSxJQUFJ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