Compare commits
234 Commits
Author | SHA1 | Date | |
---|---|---|---|
5d9624bd56 | |||
32397a97cd | |||
753b829d18 | |||
4be2784bf4 | |||
cd08cf370c | |||
b64fe567a8 | |||
2a68c9ad90 | |||
aa978413d1 | |||
f24636ba80 | |||
5e31dbb504 | |||
b2ca6e13e7 | |||
052322fb98 | |||
9e1eb0b3a0 | |||
af9b045d31 | |||
d7718d4340 | |||
92592d9e9a | |||
a786c43970 | |||
66658dc877 | |||
be78d74124 | |||
bde0404777 | |||
dfe973f5d8 | |||
326030456f | |||
184dc98127 | |||
702ce00288 | |||
ff0d745170 | |||
8fc0438c75 | |||
355c2d132e | |||
c083a47f07 | |||
9eb9403bea | |||
029f2a6872 | |||
66676d89a5 | |||
775a307056 | |||
4aa7621401 | |||
b7ac5cb864 | |||
f580281ccd | |||
cc66f81c7e | |||
6f1e32284d | |||
47b511f1f0 | |||
24f82fe570 | |||
60a0fab9db | |||
61e287fbe4 | |||
984297c9c3 | |||
55e4edc785 | |||
0fdc891326 | |||
69ab47ed41 | |||
b1bd8132de | |||
4e672b13f4 | |||
75c2f23d02 | |||
da0c459d74 | |||
079b093e2c | |||
55a3caec44 | |||
28b3666aad | |||
b17dd2ed64 | |||
e551a68237 | |||
f402e55ff3 | |||
15b8fe406a | |||
c7557163cd | |||
f84822dd5d | |||
21d6e19a22 | |||
8947738dc1 | |||
14bc5dcd25 | |||
c2f366de7f | |||
ae47276569 | |||
42b59c109d | |||
8f18faaf1c | |||
ccd5b80d67 | |||
298904e17e | |||
fa91e67aef | |||
5e99066bee | |||
a838f7eb80 | |||
979e93be27 | |||
60587f052c | |||
da5bd43a42 | |||
24559d1582 | |||
d92657b130 | |||
f8f34bf8a3 | |||
861d2c04b3 | |||
5845d74160 | |||
9dd952e6b7 | |||
742a711359 | |||
8878a0ef8b | |||
6a52e81cdd | |||
757e709f3f | |||
e0d9c3a3e0 | |||
150953adaf | |||
e0eba5d206 | |||
d9eb836f98 | |||
6d29798660 | |||
f80a84086c | |||
929a6eff07 | |||
87243881bb | |||
5d51c14bd6 | |||
453c6d6ae8 | |||
2e9fe308df | |||
96a71638a0 | |||
1c7582d328 | |||
ccff9b39be | |||
749be9ac60 | |||
7c9ad26519 | |||
6fdf08c8a9 | |||
de04d75e18 | |||
5159d7e4bf | |||
7b78aaea72 | |||
54a63d1f41 | |||
dd5a009d0f | |||
e7933cd7f4 | |||
56a8d9182b | |||
3a971301a4 | |||
b880036b64 | |||
9d756dbff7 | |||
b8111c66ff | |||
8d660a8573 | |||
596a897afc | |||
e1442b1bc8 | |||
2ca9e14f76 | |||
e65f36dfa2 | |||
adb95cd683 | |||
d2106690b4 | |||
2ea5111eb8 | |||
aae10344fe | |||
52b65d7dc3 | |||
1135b418cb | |||
2eb1dbd0b3 | |||
8ec54c17a1 | |||
500a291b2a | |||
256a14fcb0 | |||
7aa0f05bae | |||
6208cab36a | |||
50a9697baf | |||
7956cf6ace | |||
d8956d4e32 | |||
c93a67c351 | |||
fafd9867ad | |||
2dfa96bbc5 | |||
a7484e791a | |||
|
2dba68df8c | ||
6aff4c9031 | |||
e81e0ebd41 | |||
18866b9a05 | |||
71b12b2d9c | |||
0669fc3779 | |||
7021f8f1ae | |||
2392915959 | |||
b8100f8dfc | |||
04e9d8be77 | |||
a9715381c1 | |||
c2f081d69a | |||
b98f075cbd | |||
5ff74aea88 | |||
a6eaf78c80 | |||
adda1c932a | |||
7c8643b090 | |||
9e81960095 | |||
a76832bedb | |||
3c229e8e26 | |||
29d6f2d7e0 | |||
2b5ff6a4ab | |||
c75437e73f | |||
61e4a62689 | |||
d53f5410cd | |||
53516b1c8f | |||
e59205490b | |||
38884ff59c | |||
861833e930 | |||
1274840d17 | |||
d2ce1094de | |||
6b3fcff971 | |||
011a865271 | |||
78914e54b3 | |||
281cfdc38a | |||
217252de1e | |||
ab7f7230ef | |||
7f03ae5248 | |||
0060ec2971 | |||
eec89a596a | |||
d34a91d283 | |||
db14306bcf | |||
cf446f90ee | |||
9c2f3cf678 | |||
18df32ae5a | |||
66b6e78bb1 | |||
408faa97a4 | |||
4a7749be47 | |||
570283551f | |||
c6c5c5ea40 | |||
ddd071ccb6 | |||
8b9c87d381 | |||
89ea1fdb18 | |||
5b2aea7626 | |||
cfbc47e365 | |||
bb3b02ed74 | |||
bb4820e980 | |||
fa17a998f1 | |||
afad357ed0 | |||
59173eebc4 | |||
515571dcb3 | |||
177ed2d03d | |||
23ecaddd5a | |||
924058c90a | |||
30e23a77b7 | |||
b228c3b2f0 | |||
610a037879 | |||
2f681911ae | |||
3b04f81b68 | |||
0c05cf4f7b | |||
5451cceaf3 | |||
04dbc36525 | |||
a820e0d1b3 | |||
57c67a287a | |||
d73bfa8f00 | |||
e917c8b9f7 | |||
c0a5cb6e30 | |||
b85e79b07d | |||
ba714fe637 | |||
3dd4698ce8 | |||
9814e93dda | |||
5d06e6e78f | |||
f6c03275f4 | |||
d6ca9910e3 | |||
ac2267d910 | |||
49f0d7018d | |||
009a1181e5 | |||
3c09f048a2 | |||
1bdcae0524 | |||
62892fa1b8 | |||
fc96e1e2da | |||
fe552763fe | |||
c544fc8e3a | |||
9d856ad813 | |||
24b260c3da | |||
e3a811bffd | |||
95fe1f7937 | |||
e2aee98acc | |||
2705b17dde |
66
.gitea/workflows/default_nottags.yaml
Normal file
66
.gitea/workflows/default_nottags.yaml
Normal file
@ -0,0 +1,66 @@
|
||||
name: Default (not tags)
|
||||
|
||||
on:
|
||||
push:
|
||||
tags-ignore:
|
||||
- '**'
|
||||
|
||||
env:
|
||||
IMAGE: registry.gitlab.com/hosttoday/ht-docker-node:npmci
|
||||
NPMCI_COMPUTED_REPOURL: https://${{gitea.repository_owner}}:${{secrets.GITEA_TOKEN}}@gitea.lossless.digital/${{gitea.repository}}.git
|
||||
NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}}
|
||||
NPMCI_TOKEN_NPM2: ${{secrets.NPMCI_TOKEN_NPM2}}
|
||||
NPMCI_GIT_GITHUBTOKEN: ${{secrets.NPMCI_GIT_GITHUBTOKEN}}
|
||||
NPMCI_URL_CLOUDLY: ${{secrets.NPMCI_URL_CLOUDLY}}
|
||||
|
||||
jobs:
|
||||
security:
|
||||
runs-on: ubuntu-latest
|
||||
continue-on-error: true
|
||||
container:
|
||||
image: ${{ env.IMAGE }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Install pnpm and npmci
|
||||
run: |
|
||||
pnpm install -g pnpm
|
||||
pnpm install -g @shipzone/npmci
|
||||
|
||||
- name: Run npm prepare
|
||||
run: npmci npm prepare
|
||||
|
||||
- name: Audit production dependencies
|
||||
run: |
|
||||
npmci command npm config set registry https://registry.npmjs.org
|
||||
npmci command pnpm audit --audit-level=high --prod
|
||||
continue-on-error: true
|
||||
|
||||
- name: Audit development dependencies
|
||||
run: |
|
||||
npmci command npm config set registry https://registry.npmjs.org
|
||||
npmci command pnpm audit --audit-level=high --dev
|
||||
continue-on-error: true
|
||||
|
||||
test:
|
||||
if: ${{ always() }}
|
||||
needs: security
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: ${{ env.IMAGE }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Test stable
|
||||
run: |
|
||||
npmci node install stable
|
||||
npmci npm install
|
||||
npmci npm test
|
||||
|
||||
- name: Test build
|
||||
run: |
|
||||
npmci node install stable
|
||||
npmci npm install
|
||||
npmci npm build
|
124
.gitea/workflows/default_tags.yaml
Normal file
124
.gitea/workflows/default_tags.yaml
Normal file
@ -0,0 +1,124 @@
|
||||
name: Default (tags)
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- '*'
|
||||
|
||||
env:
|
||||
IMAGE: registry.gitlab.com/hosttoday/ht-docker-node:npmci
|
||||
NPMCI_COMPUTED_REPOURL: https://${{gitea.repository_owner}}:${{secrets.GITEA_TOKEN}}@gitea.lossless.digital/${{gitea.repository}}.git
|
||||
NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}}
|
||||
NPMCI_TOKEN_NPM2: ${{secrets.NPMCI_TOKEN_NPM2}}
|
||||
NPMCI_GIT_GITHUBTOKEN: ${{secrets.NPMCI_GIT_GITHUBTOKEN}}
|
||||
NPMCI_URL_CLOUDLY: ${{secrets.NPMCI_URL_CLOUDLY}}
|
||||
|
||||
jobs:
|
||||
security:
|
||||
runs-on: ubuntu-latest
|
||||
continue-on-error: true
|
||||
container:
|
||||
image: ${{ env.IMAGE }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Prepare
|
||||
run: |
|
||||
pnpm install -g pnpm
|
||||
pnpm install -g @shipzone/npmci
|
||||
npmci npm prepare
|
||||
|
||||
- name: Audit production dependencies
|
||||
run: |
|
||||
npmci command npm config set registry https://registry.npmjs.org
|
||||
npmci command pnpm audit --audit-level=high --prod
|
||||
continue-on-error: true
|
||||
|
||||
- name: Audit development dependencies
|
||||
run: |
|
||||
npmci command npm config set registry https://registry.npmjs.org
|
||||
npmci command pnpm audit --audit-level=high --dev
|
||||
continue-on-error: true
|
||||
|
||||
test:
|
||||
if: ${{ always() }}
|
||||
needs: security
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: ${{ env.IMAGE }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Prepare
|
||||
run: |
|
||||
pnpm install -g pnpm
|
||||
pnpm install -g @shipzone/npmci
|
||||
npmci npm prepare
|
||||
|
||||
- name: Test stable
|
||||
run: |
|
||||
npmci node install stable
|
||||
npmci npm install
|
||||
npmci npm test
|
||||
|
||||
- name: Test build
|
||||
run: |
|
||||
npmci node install stable
|
||||
npmci npm install
|
||||
npmci npm build
|
||||
|
||||
release:
|
||||
needs: test
|
||||
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: ${{ env.IMAGE }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Prepare
|
||||
run: |
|
||||
pnpm install -g pnpm
|
||||
pnpm install -g @shipzone/npmci
|
||||
npmci npm prepare
|
||||
|
||||
- name: Release
|
||||
run: |
|
||||
npmci node install stable
|
||||
npmci npm publish
|
||||
|
||||
metadata:
|
||||
needs: test
|
||||
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: ${{ env.IMAGE }}
|
||||
continue-on-error: true
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Prepare
|
||||
run: |
|
||||
pnpm install -g pnpm
|
||||
pnpm install -g @shipzone/npmci
|
||||
npmci npm prepare
|
||||
|
||||
- name: Code quality
|
||||
run: |
|
||||
npmci command npm install -g typescript
|
||||
npmci npm install
|
||||
|
||||
- name: Trigger
|
||||
run: npmci trigger
|
||||
|
||||
- name: Build docs and upload artifacts
|
||||
run: |
|
||||
npmci node install stable
|
||||
npmci npm install
|
||||
pnpm install -g @git.zone/tsdoc
|
||||
npmci command tsdoc
|
||||
continue-on-error: true
|
22
.gitignore
vendored
22
.gitignore
vendored
@ -1,4 +1,20 @@
|
||||
node_modules/
|
||||
docs/
|
||||
.nogit/
|
||||
|
||||
# artifacts
|
||||
coverage/
|
||||
.nogit/
|
||||
public/
|
||||
pages/
|
||||
|
||||
# installs
|
||||
node_modules/
|
||||
|
||||
# caches
|
||||
.yarn/
|
||||
.cache/
|
||||
.rpt2_cache
|
||||
|
||||
# builds
|
||||
dist/
|
||||
dist_*/
|
||||
|
||||
# custom
|
@ -1,36 +0,0 @@
|
||||
image: hosttoday/ht-docker-node:npmts
|
||||
|
||||
stages:
|
||||
- test
|
||||
- release
|
||||
|
||||
testLEGACY:
|
||||
stage: test
|
||||
script:
|
||||
- npmci test legacy
|
||||
tags:
|
||||
- docker
|
||||
|
||||
testLTS:
|
||||
stage: test
|
||||
script:
|
||||
- npmci test lts
|
||||
tags:
|
||||
- docker
|
||||
|
||||
testSTABLE:
|
||||
stage: test
|
||||
script:
|
||||
- npmci test stable
|
||||
tags:
|
||||
- docker
|
||||
|
||||
release:
|
||||
stage: release
|
||||
environment: npmjs-com_registry
|
||||
script:
|
||||
- npmci publish
|
||||
only:
|
||||
- tags
|
||||
tags:
|
||||
- docker
|
11
.vscode/launch.json
vendored
Normal file
11
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"command": "npm test",
|
||||
"name": "Run npm test",
|
||||
"request": "launch",
|
||||
"type": "node-terminal"
|
||||
}
|
||||
]
|
||||
}
|
26
.vscode/settings.json
vendored
Normal file
26
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
{
|
||||
"json.schemas": [
|
||||
{
|
||||
"fileMatch": ["/npmextra.json"],
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"npmci": {
|
||||
"type": "object",
|
||||
"description": "settings for npmci"
|
||||
},
|
||||
"gitzone": {
|
||||
"type": "object",
|
||||
"description": "settings for gitzone",
|
||||
"properties": {
|
||||
"projectType": {
|
||||
"type": "string",
|
||||
"enum": ["website", "element", "service", "npm", "wcc"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
13
README.md
13
README.md
@ -1,13 +0,0 @@
|
||||
# lik
|
||||
light little helpers for node
|
||||
|
||||
## Status
|
||||
[](https://gitlab.com/pushrocks/lik/commits/master)
|
||||
|
||||
## Usage
|
||||
We recommend the use of TypeScript for good intellisense.
|
||||
|
||||
```typescript
|
||||
// import any tool that you need from lik
|
||||
import {Stringmap} from "lik";
|
||||
```
|
55
changelog.md
Normal file
55
changelog.md
Normal file
@ -0,0 +1,55 @@
|
||||
# Changelog
|
||||
|
||||
## 2024-10-13 - 6.1.0 - feat(BackpressuredArray)
|
||||
Add method to check if items are present in BackpressuredArray
|
||||
|
||||
- Implemented a new method `checkHasItems` in the BackpressuredArray class to determine if the array contains any items.
|
||||
|
||||
## 2024-05-29 to 2024-04-18 - 6.0.15
|
||||
Minor updates were made to documentation and descriptions.
|
||||
|
||||
- Update project description
|
||||
|
||||
## 2024-04-18 to 2024-02-25 - 6.0.14
|
||||
Several updates were made to configurations and json files.
|
||||
|
||||
- Updated core components in the codebase
|
||||
- Modified tsconfig settings
|
||||
- Revised npmextra.json with githost configurations
|
||||
|
||||
## 2024-02-25 to 2024-02-23 - 6.0.13
|
||||
No relevant changes.
|
||||
|
||||
## 2024-02-23 to 2023-11-13 - 6.0.12 to 6.0.8
|
||||
Multiple core updates were performed to ensure stability and performance.
|
||||
|
||||
- Fixed various issues in core components
|
||||
|
||||
## 2023-11-13 to 2023-08-14 - 6.0.7 to 6.0.3
|
||||
Minor internal core updates.
|
||||
|
||||
## 2023-08-14 to 2023-07-12 - 6.0.2
|
||||
Implemented a switch to a new organizational scheme.
|
||||
|
||||
## 2023-01-18 to 2022-05-27 - 6.0.0
|
||||
Updated core functionalities; introduced breaking changes for compatibility with ECMAScript modules.
|
||||
|
||||
- Core updates
|
||||
- Switching from CommonJS to ECMAScript modules
|
||||
|
||||
## 2022-05-27 to 2022-05-27 - 5.0.6 to 5.0.0
|
||||
Minor updates and a significant change in `objectmap` behavior to support async operations.
|
||||
|
||||
- Included async behaviors in objectmap as a breaking change
|
||||
|
||||
## 2020-05-04 to 2020-02-17 - 4.0.0
|
||||
Refactored ObjectMap; introduced new features.
|
||||
|
||||
- Refactored ObjectMap with concat functionality as a breaking change
|
||||
- Added .clean() to FastMap
|
||||
|
||||
## 2020-02-17 to 2020-02-06 - 3.0.19 to 3.0.15
|
||||
Enhancements and new functionality in ObjectMap.
|
||||
|
||||
- Added object mapping enhancements
|
||||
- Introduced object map with unique keys
|
1
dist/index.d.ts
vendored
1
dist/index.d.ts
vendored
@ -1 +0,0 @@
|
||||
export * from "./lik.stringmap";
|
7
dist/index.js
vendored
7
dist/index.js
vendored
@ -1,7 +0,0 @@
|
||||
"use strict";
|
||||
function __export(m) {
|
||||
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
|
||||
}
|
||||
// import modules
|
||||
__export(require("./lik.stringmap"));
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBRUEsaUJBQWlCO0FBRWpCLGlCQUFjLGlCQUFpQixDQUFDLEVBQUEifQ==
|
3
dist/lik.plugins.d.ts
vendored
3
dist/lik.plugins.d.ts
vendored
@ -1,3 +0,0 @@
|
||||
import "typings-global";
|
||||
export import q = require("q");
|
||||
export import minimatch = require("minimatch");
|
5
dist/lik.plugins.js
vendored
5
dist/lik.plugins.js
vendored
@ -1,5 +0,0 @@
|
||||
"use strict";
|
||||
require("typings-global");
|
||||
exports.q = require("q");
|
||||
exports.minimatch = require("minimatch");
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlrLnBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9saWsucGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsUUFBTyxnQkFBZ0IsQ0FBQyxDQUFBO0FBQ1YsU0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLGlCQUFTLFdBQVcsV0FBVyxDQUFDLENBQUMifQ==
|
43
dist/lik.stringmap.d.ts
vendored
43
dist/lik.stringmap.d.ts
vendored
@ -1,43 +0,0 @@
|
||||
/**
|
||||
* allows you to easily keep track of a bunch of strings;
|
||||
*/
|
||||
export interface triggerFunction {
|
||||
(): boolean;
|
||||
}
|
||||
export declare class Stringmap {
|
||||
private _stringArray;
|
||||
private _triggerUntilTrueFunctionArray;
|
||||
constructor();
|
||||
/**
|
||||
* add a string to the Stringmap
|
||||
*/
|
||||
addString(stringArg: string): void;
|
||||
/**
|
||||
* removes a string from Stringmap
|
||||
*/
|
||||
removeString(stringArg: string): void;
|
||||
/**
|
||||
* wipes the Stringmap
|
||||
*/
|
||||
wipe(): void;
|
||||
/**
|
||||
* check if string is in Stringmap
|
||||
*/
|
||||
checkString(stringArg: string): boolean;
|
||||
/**
|
||||
* checks stringPresence with minimatch
|
||||
*/
|
||||
checkMinimatch(miniMatchStringArg: string): boolean;
|
||||
/**
|
||||
* checks if the Stringmap is empty
|
||||
*/
|
||||
checkIsEmpty(): boolean;
|
||||
/**
|
||||
* notifies triggers
|
||||
*/
|
||||
private notifyTrigger();
|
||||
/**
|
||||
* register a new trigger
|
||||
*/
|
||||
registerUntilTrue(functionArg: triggerFunction, doFunctionArg: any): void;
|
||||
}
|
90
dist/lik.stringmap.js
vendored
90
dist/lik.stringmap.js
vendored
@ -1,90 +0,0 @@
|
||||
"use strict";
|
||||
const plugins = require("./lik.plugins");
|
||||
class Stringmap {
|
||||
constructor() {
|
||||
this._stringArray = [];
|
||||
this._triggerUntilTrueFunctionArray = [];
|
||||
}
|
||||
;
|
||||
/**
|
||||
* add a string to the Stringmap
|
||||
*/
|
||||
addString(stringArg) {
|
||||
this._stringArray.push(stringArg);
|
||||
this.notifyTrigger();
|
||||
}
|
||||
;
|
||||
/**
|
||||
* removes a string from Stringmap
|
||||
*/
|
||||
removeString(stringArg) {
|
||||
for (let keyArg in this._stringArray) {
|
||||
if (this._stringArray[keyArg] == stringArg) {
|
||||
this._stringArray.splice(parseInt(keyArg), 1);
|
||||
}
|
||||
;
|
||||
}
|
||||
;
|
||||
this.notifyTrigger();
|
||||
}
|
||||
/**
|
||||
* wipes the Stringmap
|
||||
*/
|
||||
wipe() {
|
||||
this._stringArray = [];
|
||||
this.notifyTrigger();
|
||||
}
|
||||
/**
|
||||
* check if string is in Stringmap
|
||||
*/
|
||||
checkString(stringArg) {
|
||||
return this._stringArray.indexOf(stringArg) != -1;
|
||||
}
|
||||
/**
|
||||
* checks stringPresence with minimatch
|
||||
*/
|
||||
checkMinimatch(miniMatchStringArg) {
|
||||
let foundMatch = false;
|
||||
for (let stringItem of this._stringArray) {
|
||||
if (plugins.minimatch(stringItem, miniMatchStringArg)) {
|
||||
foundMatch = true;
|
||||
}
|
||||
;
|
||||
}
|
||||
;
|
||||
return foundMatch;
|
||||
}
|
||||
;
|
||||
/**
|
||||
* checks if the Stringmap is empty
|
||||
*/
|
||||
checkIsEmpty() {
|
||||
return (this._stringArray.length == 0);
|
||||
}
|
||||
// trigger registering
|
||||
/**
|
||||
* notifies triggers
|
||||
*/
|
||||
notifyTrigger() {
|
||||
let filteredArray = this._triggerUntilTrueFunctionArray.filter((functionArg) => {
|
||||
return !functionArg();
|
||||
});
|
||||
this._triggerUntilTrueFunctionArray = filteredArray;
|
||||
}
|
||||
;
|
||||
/**
|
||||
* register a new trigger
|
||||
*/
|
||||
registerUntilTrue(functionArg, doFunctionArg) {
|
||||
this._triggerUntilTrueFunctionArray.push(() => {
|
||||
let result = functionArg();
|
||||
if (result == true) {
|
||||
doFunctionArg();
|
||||
}
|
||||
return result;
|
||||
});
|
||||
this.notifyTrigger();
|
||||
}
|
||||
}
|
||||
exports.Stringmap = Stringmap;
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlrLnN0cmluZ21hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2xpay5zdHJpbmdtYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE1BQVksT0FBTyxXQUFNLGVBQWUsQ0FBQyxDQUFBO0FBVXpDO0lBR0k7UUFGUSxpQkFBWSxHQUFZLEVBQUUsQ0FBQztRQUMzQixtQ0FBOEIsR0FBcUIsRUFBRSxDQUFDO0lBRzlELENBQUM7O0lBQ0Q7O09BRUc7SUFDSCxTQUFTLENBQUMsU0FBZ0I7UUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3pCLENBQUM7O0lBRUQ7O09BRUc7SUFDSCxZQUFZLENBQUMsU0FBZ0I7UUFDekIsR0FBRyxDQUFDLENBQUMsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBLENBQUM7WUFDbEMsRUFBRSxDQUFBLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQSxDQUFDO2dCQUN2QyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakQsQ0FBQztZQUFBLENBQUM7UUFDTixDQUFDO1FBQUEsQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJO1FBQ0EsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVcsQ0FBQyxTQUFnQjtRQUN4QixNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYyxDQUFDLGtCQUF5QjtRQUNwQyxJQUFJLFVBQVUsR0FBVyxLQUFLLENBQUM7UUFDL0IsR0FBRyxDQUFBLENBQUMsSUFBSSxVQUFVLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBLENBQUM7WUFDckMsRUFBRSxDQUFBLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFBLENBQUM7Z0JBQ2pELFVBQVUsR0FBRyxJQUFJLENBQUM7WUFDdEIsQ0FBQztZQUFBLENBQUM7UUFDTixDQUFDO1FBQUEsQ0FBQztRQUNGLE1BQU0sQ0FBQyxVQUFVLENBQUM7SUFDdEIsQ0FBQzs7SUFFRDs7T0FFRztJQUNILFlBQVk7UUFDUixNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsc0JBQXNCO0lBRXRCOztPQUVHO0lBQ0ssYUFBYTtRQUNqQixJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVztZQUN2RSxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyw4QkFBOEIsR0FBRyxhQUFhLENBQUM7SUFDeEQsQ0FBQzs7SUFFRDs7T0FFRztJQUNILGlCQUFpQixDQUFDLFdBQTJCLEVBQUMsYUFBYTtRQUN2RCxJQUFJLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUNwQztZQUNJLElBQUksTUFBTSxHQUFHLFdBQVcsRUFBRSxDQUFDO1lBQzNCLEVBQUUsQ0FBQSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQSxDQUFDO2dCQUNmLGFBQWEsRUFBRSxDQUFDO1lBQ3BCLENBQUM7WUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ2xCLENBQUMsQ0FDSixDQUFDO1FBQ0YsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3pCLENBQUM7QUFDTCxDQUFDO0FBeEZZLGlCQUFTLFlBd0ZyQixDQUFBIn0=
|
46
docs/index.md
Normal file
46
docs/index.md
Normal file
@ -0,0 +1,46 @@
|
||||
# lik
|
||||
|
||||
light little helpers for node
|
||||
|
||||
## Availabililty
|
||||
|
||||
[](https://www.npmjs.com/package/lik)
|
||||
[](https://GitLab.com/pushrocks/lik)
|
||||
[](https://github.com/pushrocks/lik)
|
||||
[](https://pushrocks.gitlab.io/lik/)
|
||||
|
||||
## Status for master
|
||||
|
||||
[](https://GitLab.com/pushrocks/lik/commits/master)
|
||||
[](https://GitLab.com/pushrocks/lik/commits/master)
|
||||
[](https://www.npmjs.com/package/lik)
|
||||
[](https://david-dm.org/pushrocks/lik)
|
||||
[](https://www.bithound.io/github/pushrocks/lik/master/dependencies/npm)
|
||||
[](https://www.bithound.io/github/pushrocks/lik)
|
||||
[](https://nodejs.org/dist/latest-v6.x/docs/api/)
|
||||
[](https://nodejs.org/dist/latest-v6.x/docs/api/)
|
||||
[](http://standardjs.com/)
|
||||
|
||||
## Usage
|
||||
|
||||
Use TypeScript for best in class instellisense.
|
||||
|
||||
```javascript
|
||||
// import any tool that you need from lik
|
||||
import { Stringmap, Objectmap, Observablemap } from 'lik';
|
||||
```
|
||||
|
||||
### class Stringmap
|
||||
|
||||
Stringmap allows you to keep track of strings. It allows you to register triggers for certain events
|
||||
like when a certain string is removed or added to the map
|
||||
|
||||
### class Objectmap
|
||||
|
||||
Sometimes you need to keep track of objects, but implementing logic for removing, finding or updating is tedious.
|
||||
Objectmap takes care of keeping track of objects for you.
|
||||
|
||||
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
|
||||
> | By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
|
||||
|
||||
[](https://push.rocks)
|
33
npmextra.json
Normal file
33
npmextra.json
Normal file
@ -0,0 +1,33 @@
|
||||
{
|
||||
"npmci": {
|
||||
"npmGlobalTools": [],
|
||||
"npmAccessLevel": "public"
|
||||
},
|
||||
"gitzone": {
|
||||
"projectType": "npm",
|
||||
"module": {
|
||||
"githost": "code.foss.global",
|
||||
"gitscope": "push.rocks",
|
||||
"gitrepo": "lik",
|
||||
"description": "Provides a collection of lightweight helpers and utilities for Node.js projects.",
|
||||
"npmPackagename": "@push.rocks/lik",
|
||||
"license": "MIT",
|
||||
"keywords": [
|
||||
"Utilities",
|
||||
"Helpers",
|
||||
"Typescript",
|
||||
"Node.js",
|
||||
"String manipulation",
|
||||
"Object management",
|
||||
"Execution control",
|
||||
"Data structures",
|
||||
"Asynchronous programming",
|
||||
"Event handling",
|
||||
"Data aggregation"
|
||||
]
|
||||
}
|
||||
},
|
||||
"tsdoc": {
|
||||
"legal": "\n## License and Legal Information\n\nThis repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository. \n\n**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.\n\n### Trademarks\n\nThis project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.\n\n### Company Information\n\nTask Venture Capital GmbH \nRegistered at District court Bremen HRB 35230 HB, Germany\n\nFor any legal inquiries or if you require further information, please contact us via email at hello@task.vc.\n\nBy using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.\n"
|
||||
}
|
||||
}
|
71
package.json
71
package.json
@ -1,31 +1,70 @@
|
||||
{
|
||||
"name": "lik",
|
||||
"version": "1.0.3",
|
||||
"description": "light little helpers for node",
|
||||
"main": "dist/index.js",
|
||||
"typings": "dist/index.d.ts",
|
||||
"name": "@push.rocks/lik",
|
||||
"version": "6.1.0",
|
||||
"private": false,
|
||||
"description": "Provides a collection of lightweight helpers and utilities for Node.js projects.",
|
||||
"main": "dist_ts/index.js",
|
||||
"typings": "dist_ts/index.d.ts",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"test": "(npmts)"
|
||||
"test": "(tstest test/)",
|
||||
"build": "(tsbuild --web --allowimplicitany && tsbundle npm)",
|
||||
"buildDocs": "tsdoc"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+ssh://git@gitlab.com/pushrocks/lik.git"
|
||||
"url": "https://code.foss.global/push.rocks/lik.git"
|
||||
},
|
||||
"author": "Lossless GmbH",
|
||||
"license": "MIT",
|
||||
"bugs": {
|
||||
"url": "https://gitlab.com/pushrocks/lik/issues"
|
||||
},
|
||||
"homepage": "https://gitlab.com/pushrocks/lik#README",
|
||||
"homepage": "https://code.foss.global/push.rocks/lik",
|
||||
"devDependencies": {
|
||||
"npmts-g": "^5.2.6",
|
||||
"should": "^10.0.0",
|
||||
"typings-test": "^1.0.1"
|
||||
"@git.zone/tsbuild": "^2.1.72",
|
||||
"@git.zone/tsbundle": "^2.0.15",
|
||||
"@git.zone/tsrun": "^1.2.44",
|
||||
"@git.zone/tstest": "^1.0.90",
|
||||
"@push.rocks/tapbundle": "^5.0.8",
|
||||
"@types/node": "^20.12.7"
|
||||
},
|
||||
"dependencies": {
|
||||
"@types/minimatch": "^2.0.28",
|
||||
"@types/q": "^0.0.27",
|
||||
"minimatch": "^3.0.2",
|
||||
"q": "^1.4.1"
|
||||
}
|
||||
"@push.rocks/smartdelay": "^3.0.5",
|
||||
"@push.rocks/smartmatch": "^2.0.0",
|
||||
"@push.rocks/smartpromise": "^4.0.3",
|
||||
"@push.rocks/smartrx": "^3.0.7",
|
||||
"@push.rocks/smarttime": "^4.0.6",
|
||||
"@types/minimatch": "^5.1.2",
|
||||
"@types/symbol-tree": "^3.2.5",
|
||||
"symbol-tree": "^3.2.4"
|
||||
},
|
||||
"files": [
|
||||
"ts/**/*",
|
||||
"ts_web/**/*",
|
||||
"dist/**/*",
|
||||
"dist_*/**/*",
|
||||
"dist_ts/**/*",
|
||||
"dist_ts_web/**/*",
|
||||
"assets/**/*",
|
||||
"cli.js",
|
||||
"npmextra.json",
|
||||
"readme.md"
|
||||
],
|
||||
"browserslist": [
|
||||
"last 1 chrome versions"
|
||||
],
|
||||
"keywords": [
|
||||
"Utilities",
|
||||
"Helpers",
|
||||
"Typescript",
|
||||
"Node.js",
|
||||
"String manipulation",
|
||||
"Object management",
|
||||
"Execution control",
|
||||
"Data structures",
|
||||
"Asynchronous programming",
|
||||
"Event handling",
|
||||
"Data aggregation"
|
||||
]
|
||||
}
|
||||
|
4919
pnpm-lock.yaml
generated
Normal file
4919
pnpm-lock.yaml
generated
Normal file
File diff suppressed because it is too large
Load Diff
1
readme.hints.md
Normal file
1
readme.hints.md
Normal file
@ -0,0 +1 @@
|
||||
|
204
readme.md
Normal file
204
readme.md
Normal file
@ -0,0 +1,204 @@
|
||||
# @push.rocks/lik
|
||||
light little helpers for node
|
||||
|
||||
## Install
|
||||
|
||||
To install `@push.rocks/lik`, you can use npm (Node Package Manager). Simply run the following command in your terminal:
|
||||
|
||||
```bash
|
||||
npm install @push.rocks/lik --save
|
||||
```
|
||||
|
||||
This will download `@push.rocks/lik` and add it to your project's `package.json` dependencies.
|
||||
|
||||
## Usage
|
||||
|
||||
`@push.rocks/lik` is a versatile package offering a variety of helper classes designed to simplify common tasks in Node.js development. From managing asynchronous operations to handling collections efficiently, this library provides lightweight solutions to enhance your coding workflow. Below, we explore several key features of `@push.rocks/lik`, presenting TypeScript examples to demonstrate their practical application in real-world scenarios.
|
||||
|
||||
### AsyncExecutionStack
|
||||
|
||||
`AsyncExecutionStack` allows for managing asynchronous task execution with exclusive and non-exclusive slots, ensuring effective handling of resource-intensive operations.
|
||||
|
||||
```typescript
|
||||
import { AsyncExecutionStack } from '@push.rocks/lik';
|
||||
|
||||
const myAsyncStack = new AsyncExecutionStack();
|
||||
|
||||
// Exclusive execution ensures this task doesn't run in parallel with others
|
||||
await myAsyncStack.getExclusiveExecutionSlot(async () => {
|
||||
// some asynchronous operation
|
||||
}, 2500);
|
||||
|
||||
// Non-exclusive slots can run in parallel
|
||||
myAsyncStack.getNonExclusiveExecutionSlot(async () => {
|
||||
// another asynchronous operation
|
||||
}, 1500);
|
||||
```
|
||||
|
||||
### FastMap
|
||||
|
||||
`FastMap` offers a high-performance, key-value map optimized for rapid access and modifications, ideal for scenarios requiring frequent read/write operations.
|
||||
|
||||
```typescript
|
||||
import { FastMap } from '@push.rocks/lik';
|
||||
|
||||
const myFastMap = new FastMap<string>();
|
||||
|
||||
// Add items
|
||||
myFastMap.addToMap('key1', 'value1');
|
||||
myFastMap.addToMap('key2', 'value2');
|
||||
|
||||
// Retrieve item
|
||||
const value = myFastMap.getByKey('key1'); // 'value1'
|
||||
```
|
||||
|
||||
### LimitedArray
|
||||
|
||||
`LimitedArray` enforces a maximum size on an array, automatically managing its length to prevent it from exceeding a defined limit.
|
||||
|
||||
```typescript
|
||||
import { LimitedArray } from '@push.rocks/lik';
|
||||
|
||||
const myLimitedArray = new LimitedArray<number>(5); // limit size to 5
|
||||
|
||||
myLimitedArray.addMany([1, 2, 3, 4, 5, 6]);
|
||||
console.log(myLimitedArray.array); // [2, 3, 4, 5, 6]
|
||||
```
|
||||
|
||||
### LoopTracker
|
||||
|
||||
`LoopTracker` helps detect and prevent infinite loops by tracking object references during iterations.
|
||||
|
||||
```typescript
|
||||
import { LoopTracker } from '@push.rocks/lik';
|
||||
|
||||
const myLoopTracker = new LoopTracker<object>();
|
||||
const obj1 = {};
|
||||
|
||||
if (myLoopTracker.checkAndTrack(obj1)) {
|
||||
// proceed with operation
|
||||
} else {
|
||||
// potential loop detected
|
||||
}
|
||||
```
|
||||
|
||||
### ObjectMap
|
||||
|
||||
`ObjectMap` facilitates object management, providing functionalities for adding, finding, and removing objects with ease.
|
||||
|
||||
```typescript
|
||||
import { ObjectMap } from '@push.rocks/lik';
|
||||
|
||||
interface MyObject {
|
||||
id: number;
|
||||
name: string;
|
||||
}
|
||||
|
||||
const myObjectMap = new ObjectMap<MyObject>();
|
||||
const obj: MyObject = { id: 1, name: 'Test Object' };
|
||||
|
||||
// Add object
|
||||
myObjectMap.add(obj);
|
||||
|
||||
// Find object
|
||||
const found = myObjectMap.findSync(item => item.id === 1);
|
||||
```
|
||||
|
||||
### StringMap
|
||||
|
||||
`StringMap` simplifies string collection management, allowing you to add, remove, and query strings effectively.
|
||||
|
||||
```typescript
|
||||
import { Stringmap } from '@push.rocks/lik';
|
||||
|
||||
const myStringMap = new Stringmap();
|
||||
|
||||
// Add strings
|
||||
myStringMap.addString('hello');
|
||||
myStringMap.addStringArray(['world', 'example']);
|
||||
|
||||
// Check string presence
|
||||
const exists = myStringMap.checkString('hello'); // true
|
||||
```
|
||||
|
||||
### TimedAggregator
|
||||
|
||||
`TimedAggregator` batches operations over a specified time interval, useful for aggregating logs, metrics, or any data points over time.
|
||||
|
||||
```typescript
|
||||
import { TimedAggregtor } from '@push.rocks/lik';
|
||||
|
||||
const myAggregator = new TimedAggregtor<string>({
|
||||
aggregationIntervalInMillis: 5000, // 5 seconds
|
||||
functionForAggregation: (items) => {
|
||||
console.log('Aggregated items:', items);
|
||||
}
|
||||
});
|
||||
|
||||
// Add items
|
||||
myAggregator.add('item1');
|
||||
myAggregator.add('item2');
|
||||
|
||||
// After 5 seconds, the functionForAggregation will log the aggregated items
|
||||
```
|
||||
|
||||
### InterestMap and Tree
|
||||
|
||||
`InterestMap` provides a structure for managing subscriptions or interests in certain events or entities, optimizing notification mechanisms.
|
||||
|
||||
```typescript
|
||||
import { InterestMap } from '@push.rocks/lik';
|
||||
|
||||
const myInterestMap = new InterestMap<string, number>((str) => str);
|
||||
|
||||
myInterestMap.addInterest('event1').then((interest) => {
|
||||
interest.fullfillInterest(42);
|
||||
});
|
||||
```
|
||||
|
||||
`Tree` offers a way to handle hierarchical data structures, allowing for the composition and traversal of tree-like data sets.
|
||||
|
||||
```typescript
|
||||
import { Tree } from '@push.rocks/lik';
|
||||
|
||||
class TreeNode {
|
||||
constructor(public value: string) {}
|
||||
}
|
||||
|
||||
const myTree = new Tree<TreeNode>();
|
||||
const rootNode = new TreeNode('root');
|
||||
myTree.initialize(rootNode);
|
||||
|
||||
// Add child nodes
|
||||
const childNode = new TreeNode('child');
|
||||
myTree.appendChild(rootNode, childNode);
|
||||
```
|
||||
|
||||
### Utilizing @push.rocks/lik in Your Project
|
||||
|
||||
With `@push.rocks/lik`, you gain access to a comprehensive set of lightweight utilities that can significantly simplify and expedite the development process in Node.js environments. By leveraging the library's classes and functions, you can implement efficient data structures, manage asynchronous operations gracefully, and streamline complex logic with ease.
|
||||
|
||||
By integrating `@push.rocks/lik` into your project, you'll benefit from improved code clarity, reduced boilerplate, and enhanced performance, allowing you to focus on developing the core functionalities of your application. Whether you're managing various collections, executing asynchronous tasks in controlled manners, or dealing with hierarchical data, `@push.rocks/lik` provides the tools you need to achieve your objectives with minimal overhead.
|
||||
|
||||
Remember, continuous exploration of `@push.rocks/lik`'s capabilities and experimenting with its various components in different scenarios will help you unlock its full potential. As your familiarity with the library grows, you'll discover even more ways to optimize your codebase and streamline your development workflow.
|
||||
|
||||
|
||||
|
||||
## License and Legal Information
|
||||
|
||||
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
|
||||
|
||||
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
|
||||
|
||||
### Trademarks
|
||||
|
||||
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
|
||||
|
||||
### Company Information
|
||||
|
||||
Task Venture Capital GmbH
|
||||
Registered at District court Bremen HRB 35230 HB, Germany
|
||||
|
||||
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
|
||||
|
||||
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.
|
29
test/test.asyncexecutionstack.both.ts
Normal file
29
test/test.asyncexecutionstack.both.ts
Normal file
@ -0,0 +1,29 @@
|
||||
import { tap, expect } from '@push.rocks/tapbundle';
|
||||
import * as lik from '../ts/index.js';
|
||||
|
||||
let testAsyncExecutionStack: lik.AsyncExecutionStack;
|
||||
|
||||
tap.test('should create a valid instance of AsyncExectionStack', async () => {
|
||||
testAsyncExecutionStack = new lik.AsyncExecutionStack();
|
||||
expect(testAsyncExecutionStack).toBeInstanceOf(lik.AsyncExecutionStack);
|
||||
});
|
||||
|
||||
tap.test('should run in parallel', async (toolsArg) => {
|
||||
await testAsyncExecutionStack.getExclusiveExecutionSlot(async () => {
|
||||
await toolsArg.delayFor(2000);
|
||||
console.log('should run first');
|
||||
}, 2500);
|
||||
testAsyncExecutionStack.getNonExclusiveExecutionSlot(async () => {
|
||||
await toolsArg.delayFor(2000);
|
||||
console.log('should run third');
|
||||
}, 2500);
|
||||
testAsyncExecutionStack.getNonExclusiveExecutionSlot(async () => {
|
||||
await toolsArg.delayFor(1000);
|
||||
console.log('should run second');
|
||||
}, 2500);
|
||||
await testAsyncExecutionStack.getExclusiveExecutionSlot(async () => {
|
||||
console.log('should run fourth');
|
||||
}, 0);
|
||||
});
|
||||
|
||||
export default tap.start();
|
2
test/test.d.ts
vendored
2
test/test.d.ts
vendored
@ -1,2 +0,0 @@
|
||||
import "typings-test";
|
||||
import "should";
|
30
test/test.fastmap.both.ts
Normal file
30
test/test.fastmap.both.ts
Normal file
@ -0,0 +1,30 @@
|
||||
import { tap, expect } from '@push.rocks/tapbundle';
|
||||
|
||||
import * as lik from '../ts/index.js';
|
||||
|
||||
tap.test('should create a valid fastmap', async () => {
|
||||
const fastmap = new lik.FastMap();
|
||||
expect(fastmap).toBeInstanceOf(lik.FastMap);
|
||||
});
|
||||
|
||||
tap.test('should find an entry', async () => {
|
||||
const fastmap = new lik.FastMap<{
|
||||
value1: string;
|
||||
value2: string;
|
||||
}>();
|
||||
fastmap.addToMap('heythere', {
|
||||
value1: 'heyho',
|
||||
value2: 'heyho2',
|
||||
});
|
||||
fastmap.addToMap('heythere2', {
|
||||
value1: 'heyho3',
|
||||
value2: 'heyho4',
|
||||
});
|
||||
|
||||
const result = await fastmap.find(async (itemArg) => {
|
||||
return itemArg.value2 === 'heyho4';
|
||||
});
|
||||
expect(result.value1).toEqual('heyho3');
|
||||
});
|
||||
|
||||
export default tap.start();
|
25
test/test.interestmap.both.ts
Normal file
25
test/test.interestmap.both.ts
Normal file
@ -0,0 +1,25 @@
|
||||
import { tap, expect } from '@push.rocks/tapbundle';
|
||||
import * as lik from '../ts/index.js';
|
||||
|
||||
let testInterestmap: lik.InterestMap<number, number>;
|
||||
|
||||
tap.test('should create an interestmap', async () => {
|
||||
testInterestmap = new lik.InterestMap((numberArg) => {
|
||||
return numberArg.toString();
|
||||
});
|
||||
});
|
||||
|
||||
tap.test('should create an interest', async () => {
|
||||
testInterestmap.addInterest(3);
|
||||
testInterestmap.addInterest(4);
|
||||
});
|
||||
|
||||
tap.test('should return an already existing interest', async () => {
|
||||
await testInterestmap.addInterest(3);
|
||||
});
|
||||
|
||||
tap.test('should be able to inform about a lost interest', async () => {
|
||||
testInterestmap.informLostInterest(3);
|
||||
});
|
||||
|
||||
export default tap.start();
|
38
test/test.js
38
test/test.js
@ -1,38 +0,0 @@
|
||||
"use strict";
|
||||
require("typings-test");
|
||||
const lik = require("../dist/index");
|
||||
require("should");
|
||||
describe("lik", function () {
|
||||
describe("Stringmap", function () {
|
||||
let testStringmap;
|
||||
let testString1 = "testString1";
|
||||
let testString2 = "testString2";
|
||||
let testString3 = "testString3";
|
||||
it("should create an instance of Stringmap", function () {
|
||||
testStringmap = new lik.Stringmap();
|
||||
testStringmap.should.be.instanceof(lik.Stringmap);
|
||||
});
|
||||
it("should return false for an string not in Stringmap", function () {
|
||||
testStringmap.checkString(testString1).should.be.false();
|
||||
});
|
||||
it("should add an string to Stringmap", function () {
|
||||
testStringmap.addString(testString1);
|
||||
testStringmap.addString(testString2);
|
||||
testStringmap.addString(testString3);
|
||||
testStringmap.checkString(testString1).should.be.true();
|
||||
testStringmap.checkString(testString2).should.be.true();
|
||||
testStringmap.checkString(testString3).should.be.true();
|
||||
});
|
||||
it("should remove a string from Stringmap", function () {
|
||||
testStringmap.removeString(testString2);
|
||||
testStringmap.checkString(testString2).should.be.false();
|
||||
});
|
||||
it("should register a function to trigger when empty", function () {
|
||||
testStringmap.registerUntilTrue(() => { return testStringmap.checkIsEmpty(); }, () => { console.log("Stringmap now is empty"); });
|
||||
});
|
||||
it("should remove wipe and then notify", function () {
|
||||
testStringmap.wipe();
|
||||
});
|
||||
});
|
||||
});
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLFFBQU8sY0FBYyxDQUFDLENBQUE7QUFDdEIsTUFBTyxHQUFHLFdBQVcsZUFBZSxDQUFDLENBQUM7QUFDdEMsUUFBTyxRQUFRLENBQUMsQ0FBQTtBQUVoQixRQUFRLENBQUMsS0FBSyxFQUFDO0lBQ1gsUUFBUSxDQUFDLFdBQVcsRUFBQztRQUNqQixJQUFJLGFBQTJCLENBQUM7UUFDaEMsSUFBSSxXQUFXLEdBQUcsYUFBYSxDQUFDO1FBQ2hDLElBQUksV0FBVyxHQUFHLGFBQWEsQ0FBQztRQUNoQyxJQUFJLFdBQVcsR0FBRyxhQUFhLENBQUM7UUFDaEMsRUFBRSxDQUFDLHdDQUF3QyxFQUFDO1lBQ3hDLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLG9EQUFvRCxFQUFDO1lBQ3BELGFBQWEsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3RCxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyxtQ0FBbUMsRUFBQztZQUNuQyxhQUFhLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3JDLGFBQWEsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDckMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNyQyxhQUFhLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDeEQsYUFBYSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hELGFBQWEsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1RCxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyx1Q0FBdUMsRUFBQztZQUN2QyxhQUFhLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3hDLGFBQWEsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3RCxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyxrREFBa0QsRUFBQztZQUNsRCxhQUFhLENBQUMsaUJBQWlCLENBQzNCLFFBQU8sTUFBTSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQSxDQUFBLENBQUMsRUFDM0MsUUFBTyxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUEsQ0FBQSxDQUFDLENBQ2hELENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyxvQ0FBb0MsRUFBQztZQUNwQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQyxDQUFDIn0=
|
17
test/test.limitedarray.both.ts
Normal file
17
test/test.limitedarray.both.ts
Normal file
@ -0,0 +1,17 @@
|
||||
import { tap, expect } from '@push.rocks/tapbundle';
|
||||
|
||||
import { LimitedArray } from '../ts/index.js';
|
||||
|
||||
let testLimitedArray: LimitedArray<string>;
|
||||
|
||||
tap.test('should create a LimitedArray', async () => {
|
||||
testLimitedArray = new LimitedArray(6);
|
||||
expect(testLimitedArray).toBeInstanceOf(LimitedArray);
|
||||
});
|
||||
|
||||
tap.test('should never be longer than the set length', async () => {
|
||||
testLimitedArray.addMany(['hi', 'this', 'is', 'quite', 'a', 'long', 'string', ':)']);
|
||||
expect(testLimitedArray.array.length < 7).toBeTrue();
|
||||
});
|
||||
|
||||
export default tap.start();
|
24
test/test.looptracker.both.ts
Normal file
24
test/test.looptracker.both.ts
Normal file
@ -0,0 +1,24 @@
|
||||
// import test framework
|
||||
import { expect, tap } from '@push.rocks/tapbundle';
|
||||
|
||||
// import the module
|
||||
import * as lik from '../ts/index.js';
|
||||
|
||||
let object1 = {};
|
||||
let object2 = {};
|
||||
let myLoopTracker: lik.LoopTracker<any>;
|
||||
|
||||
// tests
|
||||
tap.test('should create a valid looptracker instance', async () => {
|
||||
myLoopTracker = new lik.LoopTracker();
|
||||
expect(myLoopTracker).toBeInstanceOf(lik.LoopTracker);
|
||||
});
|
||||
|
||||
tap.test('should add objects once and return true', async () => {
|
||||
expect(myLoopTracker.checkAndTrack(object1)).toBeTrue();
|
||||
expect(myLoopTracker.checkAndTrack(object1)).toBeFalse();
|
||||
expect(myLoopTracker.checkAndTrack(object2)).toBeTrue();
|
||||
expect(myLoopTracker.checkAndTrack(object2)).toBeFalse();
|
||||
});
|
||||
|
||||
export default tap.start();
|
76
test/test.objectmap.both.ts
Normal file
76
test/test.objectmap.both.ts
Normal file
@ -0,0 +1,76 @@
|
||||
// import test framework
|
||||
import { expect, tap } from '@push.rocks/tapbundle';
|
||||
|
||||
// import the module
|
||||
import * as lik from '../ts/index.js';
|
||||
|
||||
// Objectmap
|
||||
interface ITestObject {
|
||||
propOne: string;
|
||||
propTwo: string;
|
||||
}
|
||||
let testObjectmap: lik.ObjectMap<ITestObject>;
|
||||
let testObject1: ITestObject = {
|
||||
propOne: 'hello',
|
||||
propTwo: 'hello2',
|
||||
};
|
||||
let testObject2: ITestObject = {
|
||||
propOne: 'hello',
|
||||
propTwo: 'hello2',
|
||||
};
|
||||
|
||||
tap.test('new lik.Objectmap() -> should correctly instantiate an Objectmap', async () => {
|
||||
testObjectmap = new lik.ObjectMap<ITestObject>();
|
||||
expect(testObjectmap).toBeInstanceOf(lik.ObjectMap);
|
||||
});
|
||||
|
||||
tap.test('lik.Objectmap.add() -> should correctly add an object to Objectmap', async () => {
|
||||
testObjectmap.add(testObject1);
|
||||
// tslint:disable-next-line:no-unused-expression
|
||||
expect(testObjectmap.checkForObject(testObject1)).toBeTrue();
|
||||
// tslint:disable-next-line:no-unused-expression
|
||||
expect(testObjectmap.checkForObject(testObject2)).toBeFalse();
|
||||
});
|
||||
|
||||
tap.test('lik.Objectmap.remove() -> should correctly remove an object to Objectmap', async () => {
|
||||
testObjectmap.add(testObject2);
|
||||
testObjectmap.remove(testObject1);
|
||||
// tslint:disable-next-line:no-unused-expression
|
||||
expect(testObjectmap.checkForObject(testObject1)).toBeFalse();
|
||||
// tslint:disable-next-line:no-unused-expression
|
||||
expect(testObjectmap.checkForObject(testObject2)).toBeTrue();
|
||||
});
|
||||
|
||||
tap.test('Objectmap.forEach -> should correctly run a function forEach map object', async () => {
|
||||
testObjectmap.forEach((itemArg) => {
|
||||
expect(itemArg).toHaveProperty('propOne');
|
||||
});
|
||||
});
|
||||
|
||||
tap.test('lik.Objectmap.find() -> should correctly find an object', async () => {
|
||||
let myObject = { propOne: 'helloThere', propTwo: 'helloAnyway' };
|
||||
testObjectmap.add(myObject);
|
||||
let referenceObject = await testObjectmap.find(async (itemArg) => {
|
||||
return itemArg.propOne === 'helloThere';
|
||||
});
|
||||
// tslint:disable-next-line:no-unused-expression
|
||||
expect(myObject === referenceObject).toBeTrue();
|
||||
});
|
||||
|
||||
tap.test('lik.Objectmap.getArray() -> should return a cloned array', async () => {
|
||||
let myObject = { propOne: 'test1', propTwo: 'wow, how awesome' };
|
||||
testObjectmap.add(myObject);
|
||||
let clonedArray = testObjectmap.getArray();
|
||||
expect(clonedArray[clonedArray.length - 1]).toEqual(myObject);
|
||||
});
|
||||
|
||||
tap.test('should get one object and then remove it', async () => {
|
||||
let originalLength = testObjectmap.getArray().length;
|
||||
let oneObject = testObjectmap.getOneAndRemove();
|
||||
// tslint:disable-next-line:no-unused-expression
|
||||
expect(oneObject).not.toBeNull();
|
||||
expect(testObjectmap.getArray().length).toEqual(originalLength - 1);
|
||||
expect(testObjectmap.getArray()).not.toContain(oneObject);
|
||||
});
|
||||
|
||||
export default tap.start();
|
86
test/test.stringmap.both.ts
Normal file
86
test/test.stringmap.both.ts
Normal file
@ -0,0 +1,86 @@
|
||||
// import test framework
|
||||
import { expect, tap } from '@push.rocks/tapbundle';
|
||||
|
||||
// import the module
|
||||
import * as lik from '../ts/index.js';
|
||||
|
||||
// testData
|
||||
let testStringmap: lik.Stringmap;
|
||||
let testString1 = 'testString1';
|
||||
let testString2 = 'testString2';
|
||||
let testString3 = 'testString3';
|
||||
let testString4 = 'testString4';
|
||||
let testString5 = 'testString5';
|
||||
let testString6 = 'testString6';
|
||||
|
||||
// tests
|
||||
tap.test('new lik.Objectmap() -> should create an instance of Stringmap', async () => {
|
||||
testStringmap = new lik.Stringmap();
|
||||
expect(testStringmap).toBeInstanceOf(lik.Stringmap);
|
||||
});
|
||||
|
||||
tap.test(
|
||||
'lik.Stringmap.checkString -> should return false for an string not in Stringmap',
|
||||
async () => {
|
||||
// tslint:disable-next-line:no-unused-expression
|
||||
expect(testStringmap.checkString(testString1)).toBeFalse();
|
||||
}
|
||||
);
|
||||
|
||||
tap.test('lik.Stringmap.addString -> should add an string to Stringmap', async () => {
|
||||
testStringmap.addString(testString1);
|
||||
testStringmap.addString(testString2);
|
||||
testStringmap.addString(testString3);
|
||||
// tslint:disable-next-line:no-unused-expression
|
||||
expect(testStringmap.checkString(testString1)).toBeTrue();
|
||||
// tslint:disable-next-line:no-unused-expression
|
||||
expect(testStringmap.checkString(testString2)).toBeTrue();
|
||||
// tslint:disable-next-line:no-unused-expression
|
||||
expect(testStringmap.checkString(testString3)).toBeTrue();
|
||||
// tslint:disable-next-line:no-unused-expression
|
||||
expect(testStringmap.checkMinimatch('*String1')).toBeTrue();
|
||||
// tslint:disable-next-line:no-unused-expression
|
||||
expect(testStringmap.checkMinimatch('*String2')).toBeTrue();
|
||||
// tslint:disable-next-line:no-unused-expression
|
||||
expect(testStringmap.checkMinimatch('*String4')).toBeFalse();
|
||||
});
|
||||
|
||||
tap.test('lik.Stringmap.addStringArray -> should add an array of strings', async () => {
|
||||
testStringmap.addStringArray([testString4, testString5, testString6]);
|
||||
// tslint:disable-next-line:no-unused-expression
|
||||
expect(testStringmap.checkMinimatch('*String4')).toBeTrue();
|
||||
});
|
||||
|
||||
tap.test('lik.Stringmap.removeString -> should remove a string from Stringmap', async () => {
|
||||
testStringmap.removeString(testString2);
|
||||
// tslint:disable-next-line:no-unused-expression
|
||||
expect(testStringmap.checkString(testString2)).toBeFalse();
|
||||
});
|
||||
|
||||
tap.test('lik.Stringmap.getStringArray() -> should return a copy of stringArray', async () => {
|
||||
let clonedArray = testStringmap.getStringArray();
|
||||
// tslint:disable-next-line:no-unused-expression
|
||||
expect(clonedArray[0] === 'testString1').toBeTrue();
|
||||
// tslint:disable-next-line:no-unused-expression
|
||||
expect(clonedArray[0] === testString1).toBeTrue();
|
||||
});
|
||||
|
||||
tap.test(
|
||||
'lik.Stringmap.checkIsEmpty() -> should register a function to trigger when empty',
|
||||
async () => {
|
||||
testStringmap.registerUntilTrue(
|
||||
() => {
|
||||
return testStringmap.checkIsEmpty();
|
||||
},
|
||||
() => {
|
||||
console.log('Stringmap now is empty');
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
tap.test('lik.Stringmap.empty() -> should remove wipe and then notify', async () => {
|
||||
testStringmap.wipe();
|
||||
});
|
||||
|
||||
export default tap.start();
|
23
test/test.timedaggregator.both.ts
Normal file
23
test/test.timedaggregator.both.ts
Normal file
@ -0,0 +1,23 @@
|
||||
// import test framework
|
||||
import { expect, tap } from '@push.rocks/tapbundle';
|
||||
|
||||
// import the module
|
||||
import * as lik from '../ts/index.js';
|
||||
|
||||
let testTimedAggregator: lik.TimedAggregtor<string>;
|
||||
|
||||
tap.test('should create a timed aggregaotor', async (tools) => {
|
||||
testTimedAggregator = new lik.TimedAggregtor<string>({
|
||||
aggregationIntervalInMillis: 1000,
|
||||
functionForAggregation: (aggregation) => {
|
||||
console.log(aggregation);
|
||||
},
|
||||
});
|
||||
testTimedAggregator.add('This');
|
||||
testTimedAggregator.add('is a whole sentence.');
|
||||
await tools.delayFor(1001);
|
||||
testTimedAggregator.add('This one is another.');
|
||||
await tools.delayFor(2000);
|
||||
});
|
||||
|
||||
export default tap.start();
|
40
test/test.tree.both.ts
Normal file
40
test/test.tree.both.ts
Normal file
@ -0,0 +1,40 @@
|
||||
import { tap, expect } from '@push.rocks/tapbundle';
|
||||
import * as lik from '../ts/index.js';
|
||||
|
||||
class TestClass {
|
||||
constructor(public hey: string) {
|
||||
// nothing here
|
||||
}
|
||||
}
|
||||
|
||||
let testTree = new lik.Tree<TestClass>();
|
||||
|
||||
let testInstance = new TestClass('first');
|
||||
let testInstance2 = new TestClass('second');
|
||||
let testInstance3 = new TestClass('third');
|
||||
let testInstance4 = new TestClass('fourth');
|
||||
let testInstance5 = new TestClass('fifth');
|
||||
let testInstance6 = new TestClass('sixth');
|
||||
|
||||
tap.test('create a valid tree instance', async () => {
|
||||
testTree = new lik.Tree();
|
||||
expect(testTree).toBeInstanceOf(lik.Tree);
|
||||
});
|
||||
|
||||
tap.test('should insert an object', async () => {
|
||||
testTree.initialize(testInstance);
|
||||
let resultArray = testTree.treeToArray(testInstance, {});
|
||||
expect(resultArray).toContain(testInstance);
|
||||
});
|
||||
|
||||
tap.test('should add other objects in a hierachy', async () => {
|
||||
testTree.appendChild(testInstance, testInstance2);
|
||||
testTree.appendChild(testInstance, testInstance3);
|
||||
testTree.appendChild(testInstance, testInstance4);
|
||||
});
|
||||
|
||||
tap.test("should create a JSON object that reflects a tree's hierachy", async () => {
|
||||
const jsonTreet = testTree.toJsonWithHierachy(testInstance);
|
||||
});
|
||||
|
||||
export default tap.start();
|
40
test/test.ts
40
test/test.ts
@ -1,40 +0,0 @@
|
||||
import "typings-test";
|
||||
import lik = require("../dist/index");
|
||||
import "should";
|
||||
|
||||
describe("lik",function(){
|
||||
describe("Stringmap",function(){
|
||||
let testStringmap:lik.Stringmap;
|
||||
let testString1 = "testString1";
|
||||
let testString2 = "testString2";
|
||||
let testString3 = "testString3";
|
||||
it("should create an instance of Stringmap",function(){
|
||||
testStringmap = new lik.Stringmap();
|
||||
testStringmap.should.be.instanceof(lik.Stringmap);
|
||||
});
|
||||
it("should return false for an string not in Stringmap",function(){
|
||||
testStringmap.checkString(testString1).should.be.false();
|
||||
});
|
||||
it("should add an string to Stringmap",function(){
|
||||
testStringmap.addString(testString1);
|
||||
testStringmap.addString(testString2);
|
||||
testStringmap.addString(testString3);
|
||||
testStringmap.checkString(testString1).should.be.true();
|
||||
testStringmap.checkString(testString2).should.be.true();
|
||||
testStringmap.checkString(testString3).should.be.true();
|
||||
});
|
||||
it("should remove a string from Stringmap",function(){
|
||||
testStringmap.removeString(testString2);
|
||||
testStringmap.checkString(testString2).should.be.false();
|
||||
});
|
||||
it("should register a function to trigger when empty",function(){
|
||||
testStringmap.registerUntilTrue(
|
||||
() => {return testStringmap.checkIsEmpty()},
|
||||
() => {console.log("Stringmap now is empty")}
|
||||
);
|
||||
});
|
||||
it("should remove wipe and then notify",function(){
|
||||
testStringmap.wipe();
|
||||
})
|
||||
})
|
||||
});
|
8
ts/00_commitinfo_data.ts
Normal file
8
ts/00_commitinfo_data.ts
Normal file
@ -0,0 +1,8 @@
|
||||
/**
|
||||
* autocreated commitinfo by @push.rocks/commitinfo
|
||||
*/
|
||||
export const commitinfo = {
|
||||
name: '@push.rocks/lik',
|
||||
version: '6.1.0',
|
||||
description: 'Provides a collection of lightweight helpers and utilities for Node.js projects.'
|
||||
}
|
110
ts/classes.asyncexecutionstack.ts
Normal file
110
ts/classes.asyncexecutionstack.ts
Normal file
@ -0,0 +1,110 @@
|
||||
import * as plugins from './classes.plugins.js';
|
||||
|
||||
interface IExecutionSlot<T> {
|
||||
executionDeferred: plugins.smartpromise.Deferred<T>;
|
||||
funcToExecute: () => Promise<T>;
|
||||
timeout?: number;
|
||||
mode: 'exclusive' | 'nonexclusive';
|
||||
}
|
||||
|
||||
export class AsyncExecutionStack {
|
||||
private executionSlots: IExecutionSlot<any>[] = [];
|
||||
private isProcessing = false;
|
||||
|
||||
public async getExclusiveExecutionSlot<T = any>(
|
||||
funcArg: () => Promise<T>,
|
||||
timeoutArg?: number
|
||||
): Promise<T> {
|
||||
const executionDeferred = plugins.smartpromise.defer<T>();
|
||||
const executionSlot: IExecutionSlot<T> = {
|
||||
funcToExecute: funcArg,
|
||||
executionDeferred,
|
||||
timeout: timeoutArg,
|
||||
mode: 'exclusive',
|
||||
};
|
||||
this.executionSlots.push(executionSlot);
|
||||
this.processExecutionSlots();
|
||||
return executionDeferred.promise;
|
||||
}
|
||||
|
||||
public async getNonExclusiveExecutionSlot<T = any>(
|
||||
funcArg: () => Promise<T>,
|
||||
timeoutArg?: number
|
||||
): Promise<T> {
|
||||
const executionDeferred = plugins.smartpromise.defer<T>();
|
||||
const executionSlot: IExecutionSlot<T> = {
|
||||
funcToExecute: funcArg,
|
||||
executionDeferred,
|
||||
timeout: timeoutArg,
|
||||
mode: 'nonexclusive',
|
||||
};
|
||||
this.executionSlots.push(executionSlot);
|
||||
this.processExecutionSlots();
|
||||
return executionDeferred.promise;
|
||||
}
|
||||
|
||||
private async processExecutionSlots() {
|
||||
if (this.isProcessing) {
|
||||
return;
|
||||
}
|
||||
this.isProcessing = true;
|
||||
|
||||
while (this.executionSlots.length > 0) {
|
||||
const currentSlot = this.executionSlots[0];
|
||||
if (currentSlot.mode === 'exclusive') {
|
||||
await this.executeExclusiveSlot(currentSlot);
|
||||
this.executionSlots.shift();
|
||||
} else {
|
||||
// Gather all non-exclusive slots at the front of the queue
|
||||
const nonExclusiveSlots: IExecutionSlot<any>[] = [];
|
||||
while (this.executionSlots.length > 0 && this.executionSlots[0].mode === 'nonexclusive') {
|
||||
nonExclusiveSlots.push(this.executionSlots.shift()!);
|
||||
}
|
||||
await this.executeNonExclusiveSlots(nonExclusiveSlots);
|
||||
}
|
||||
}
|
||||
this.isProcessing = false;
|
||||
}
|
||||
|
||||
private async executeExclusiveSlot(slot: IExecutionSlot<any>) {
|
||||
try {
|
||||
if (slot.timeout) {
|
||||
const result = await Promise.race([
|
||||
slot.funcToExecute(),
|
||||
plugins.smartdelay.delayFor(slot.timeout).then(() => {
|
||||
throw new Error('Timeout reached');
|
||||
}),
|
||||
]);
|
||||
slot.executionDeferred.resolve(result);
|
||||
} else {
|
||||
const result = await slot.funcToExecute();
|
||||
slot.executionDeferred.resolve(result);
|
||||
}
|
||||
} catch (error) {
|
||||
slot.executionDeferred.reject(error);
|
||||
}
|
||||
}
|
||||
|
||||
private async executeNonExclusiveSlots(slots: IExecutionSlot<any>[]) {
|
||||
const promises = slots.map(async (slot) => {
|
||||
try {
|
||||
if (slot.timeout) {
|
||||
const result = await Promise.race([
|
||||
slot.funcToExecute(),
|
||||
plugins.smartdelay.delayFor(slot.timeout).then(() => {
|
||||
throw new Error('Timeout reached');
|
||||
}),
|
||||
]);
|
||||
slot.executionDeferred.resolve(result);
|
||||
} else {
|
||||
const result = await slot.funcToExecute();
|
||||
slot.executionDeferred.resolve(result);
|
||||
}
|
||||
} catch (error) {
|
||||
slot.executionDeferred.reject(error);
|
||||
}
|
||||
});
|
||||
|
||||
await Promise.all(promises);
|
||||
}
|
||||
}
|
66
ts/classes.backpressuredarray.ts
Normal file
66
ts/classes.backpressuredarray.ts
Normal file
@ -0,0 +1,66 @@
|
||||
import * as plugins from './classes.plugins.js';
|
||||
|
||||
export class BackpressuredArray<T> {
|
||||
public data: T[];
|
||||
private highWaterMark: number;
|
||||
public hasSpace = new plugins.smartrx.rxjs.Subject<'hasSpace'>();
|
||||
private itemsAvailable = new plugins.smartrx.rxjs.Subject<'itemsAvailable'>();
|
||||
|
||||
constructor(highWaterMark: number = 16) {
|
||||
this.data = [];
|
||||
this.highWaterMark = highWaterMark;
|
||||
}
|
||||
|
||||
push(item: T): boolean {
|
||||
this.data.push(item);
|
||||
this.itemsAvailable.next('itemsAvailable');
|
||||
|
||||
const spaceAvailable = this.checkSpaceAvailable();
|
||||
if (spaceAvailable) {
|
||||
this.hasSpace.next('hasSpace');
|
||||
}
|
||||
return spaceAvailable;
|
||||
}
|
||||
|
||||
shift(): T | undefined {
|
||||
const item = this.data.shift();
|
||||
if (this.checkSpaceAvailable()) {
|
||||
this.hasSpace.next('hasSpace');
|
||||
}
|
||||
return item;
|
||||
}
|
||||
|
||||
checkSpaceAvailable(): boolean {
|
||||
return this.data.length < this.highWaterMark;
|
||||
}
|
||||
|
||||
public checkHasItems(): boolean {
|
||||
return this.data.length > 0;
|
||||
}
|
||||
|
||||
waitForSpace(): Promise<void> {
|
||||
return new Promise<void>((resolve) => {
|
||||
if (this.checkSpaceAvailable()) {
|
||||
resolve();
|
||||
} else {
|
||||
const subscription = this.hasSpace.subscribe(() => {
|
||||
subscription.unsubscribe();
|
||||
resolve();
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
waitForItems(): Promise<void> {
|
||||
return new Promise<void>((resolve) => {
|
||||
if (this.data.length > 0) {
|
||||
resolve();
|
||||
} else {
|
||||
const subscription = this.itemsAvailable.subscribe(() => {
|
||||
subscription.unsubscribe();
|
||||
resolve();
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
97
ts/classes.fastmap.ts
Normal file
97
ts/classes.fastmap.ts
Normal file
@ -0,0 +1,97 @@
|
||||
/* ============
|
||||
The FastMap has the goal of creating the fastes to use map possible in JS
|
||||
|
||||
============ */
|
||||
|
||||
import * as plugins from './classes.plugins.js';
|
||||
|
||||
/**
|
||||
* fast map allows for very quick lookups of objects with a unique key
|
||||
*/
|
||||
export class FastMap<T> {
|
||||
private mapObject: { [key: string]: T } = {};
|
||||
|
||||
public isUniqueKey(keyArg: string): boolean {
|
||||
return this.mapObject[keyArg] ? false : true;
|
||||
}
|
||||
|
||||
public addToMap(
|
||||
keyArg: string,
|
||||
objectArg: T,
|
||||
optionsArg?: {
|
||||
force: boolean;
|
||||
}
|
||||
): boolean {
|
||||
if (this.isUniqueKey(keyArg) || (optionsArg && optionsArg.force)) {
|
||||
this.mapObject[keyArg] = objectArg;
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public getByKey(keyArg: string) {
|
||||
return this.mapObject[keyArg];
|
||||
}
|
||||
|
||||
public removeFromMap(keyArg: string): T {
|
||||
const removedItem = this.getByKey(keyArg);
|
||||
delete this.mapObject[keyArg];
|
||||
return removedItem;
|
||||
}
|
||||
|
||||
public getKeys() {
|
||||
const keys: string[] = [];
|
||||
for (const keyArg in this.mapObject) {
|
||||
if (this.mapObject[keyArg]) {
|
||||
keys.push(keyArg);
|
||||
}
|
||||
}
|
||||
return keys;
|
||||
}
|
||||
|
||||
public clean() {
|
||||
this.mapObject = {};
|
||||
}
|
||||
|
||||
/**
|
||||
* returns a new Fastmap that includes all values from this and all from the fastmap in the argument
|
||||
*/
|
||||
public concat(fastMapArg: FastMap<T>) {
|
||||
const concatedFastmap = new FastMap<T>();
|
||||
for (const key of this.getKeys()) {
|
||||
concatedFastmap.addToMap(key, this.getByKey(key));
|
||||
}
|
||||
|
||||
for (const key of fastMapArg.getKeys()) {
|
||||
concatedFastmap.addToMap(key, fastMapArg.getByKey(key), {
|
||||
force: true,
|
||||
});
|
||||
}
|
||||
|
||||
return concatedFastmap;
|
||||
}
|
||||
|
||||
/**
|
||||
* tries to merge another Fastmap
|
||||
* Note: uniqueKeyCollisions will cause overwrite
|
||||
* @param fastMapArg
|
||||
*/
|
||||
public addAllFromOther(fastMapArg: FastMap<T>) {
|
||||
for (const key of fastMapArg.getKeys()) {
|
||||
this.addToMap(key, fastMapArg.getByKey(key), {
|
||||
force: true,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
public async find(findFunctionArg: (mapItemArg: T) => Promise<boolean>) {
|
||||
for (const key of this.getKeys()) {
|
||||
const item = this.getByKey(key);
|
||||
const findFunctionResult = await findFunctionArg(item);
|
||||
if (findFunctionResult) {
|
||||
return item;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
93
ts/classes.interestmap.interest.ts
Normal file
93
ts/classes.interestmap.interest.ts
Normal file
@ -0,0 +1,93 @@
|
||||
import * as plugins from './classes.plugins.js';
|
||||
|
||||
import { InterestMap, type IInterestComparisonFunc } from './classes.interestmap.js';
|
||||
|
||||
export interface IInterestOptions<DTInterestFullfillment> {
|
||||
markLostAfterDefault: number;
|
||||
defaultFullfillment?: DTInterestFullfillment;
|
||||
}
|
||||
|
||||
export class Interest<DTInterestId, DTInterestFullfillment> {
|
||||
public options: IInterestOptions<DTInterestFullfillment>;
|
||||
|
||||
private interestMapRef: InterestMap<DTInterestId, DTInterestFullfillment>;
|
||||
public originalInterest: DTInterestId;
|
||||
public comparisonFunc: IInterestComparisonFunc<DTInterestId>;
|
||||
public destructionTimer = new plugins.smarttime.Timer(10000);
|
||||
public isFullfilled = false;
|
||||
|
||||
/**
|
||||
* a generic store to store objects in that are needed for fullfillment;
|
||||
*/
|
||||
public fullfillmentStore: any[] = [];
|
||||
|
||||
/**
|
||||
* quick access to a string that makes the interest comparable for checking for similar interests
|
||||
*/
|
||||
public get comparisonString() {
|
||||
return this.comparisonFunc(this.originalInterest);
|
||||
}
|
||||
|
||||
private interestDeferred: plugins.smartpromise.Deferred<DTInterestFullfillment> =
|
||||
new plugins.smartpromise.Deferred();
|
||||
public interestFullfilled = this.interestDeferred.promise;
|
||||
|
||||
/**
|
||||
* fullfill the interest
|
||||
*/
|
||||
public fullfillInterest(objectArg: DTInterestFullfillment) {
|
||||
this.isFullfilled = true;
|
||||
this.fullfillmentStore = [];
|
||||
this.interestDeferred.resolve(objectArg);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
constructor(
|
||||
interestMapArg: InterestMap<DTInterestId, DTInterestFullfillment>,
|
||||
interestArg: DTInterestId,
|
||||
comparisonFuncArg: IInterestComparisonFunc<DTInterestId>,
|
||||
optionsArg?: IInterestOptions<DTInterestFullfillment>
|
||||
) {
|
||||
this.interestMapRef = interestMapArg;
|
||||
this.originalInterest = interestArg;
|
||||
this.comparisonFunc = comparisonFuncArg;
|
||||
this.options = optionsArg;
|
||||
|
||||
this.destructionTimer.completed.then(() => {
|
||||
this.destroy();
|
||||
});
|
||||
if (this.options?.markLostAfterDefault) {
|
||||
plugins.smartdelay.delayFor(this.options.markLostAfterDefault).then(this.markLost);
|
||||
}
|
||||
}
|
||||
|
||||
// ===============================
|
||||
// LIFECYCLE MANAGEMENT
|
||||
// ===============================
|
||||
|
||||
/**
|
||||
* self destructs the interest
|
||||
*/
|
||||
public destroy() {
|
||||
this.interestMapRef.removeInterest(this);
|
||||
if (!this.isFullfilled && this.options.defaultFullfillment) {
|
||||
this.fullfillInterest(this.options.defaultFullfillment);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* notifies the interest that the interest in it has been lost
|
||||
*/
|
||||
public markLost() {
|
||||
this.destructionTimer.start();
|
||||
}
|
||||
|
||||
/**
|
||||
* notifies the interest that the interest in it has been restored
|
||||
*/
|
||||
public renew() {
|
||||
this.destructionTimer.reset();
|
||||
}
|
||||
}
|
134
ts/classes.interestmap.ts
Normal file
134
ts/classes.interestmap.ts
Normal file
@ -0,0 +1,134 @@
|
||||
/* ===========
|
||||
The InterestMap is an mechanism that collects interests into something
|
||||
An interest is expressed by an object, string or number.
|
||||
A comparison func can be specified to make interests comparable
|
||||
|
||||
For every unique interestId an interest is created.
|
||||
Subssequent interests will be mapped to the same interest
|
||||
which is then is only fullfilled once.
|
||||
=========== */
|
||||
|
||||
import * as plugins from './classes.plugins.js';
|
||||
import { ObjectMap } from './classes.objectmap.js';
|
||||
import { Interest } from './classes.interestmap.interest.js';
|
||||
|
||||
export type IInterestComparisonFunc<T> = (objectArg: T) => string;
|
||||
|
||||
export interface IInterestMapOptions {
|
||||
markLostAfterDefault?: number;
|
||||
}
|
||||
|
||||
export class InterestMap<DTInterestId, DTInterestFullfillment> {
|
||||
public options: IInterestMapOptions;
|
||||
|
||||
/**
|
||||
* stores interests that are currently fullfilled by the cache
|
||||
*/
|
||||
private interestObjectMap = new ObjectMap<Interest<DTInterestId, DTInterestFullfillment>>();
|
||||
|
||||
/**
|
||||
* a function to compare interests
|
||||
*/
|
||||
private comparisonFunc: IInterestComparisonFunc<DTInterestId>;
|
||||
|
||||
constructor(
|
||||
comparisonFuncArg: IInterestComparisonFunc<DTInterestId>,
|
||||
optionsArg: IInterestMapOptions = {}
|
||||
) {
|
||||
this.comparisonFunc = comparisonFuncArg;
|
||||
this.options = optionsArg;
|
||||
}
|
||||
|
||||
/**
|
||||
* adds an interest to the InterestMap
|
||||
* @param interestId
|
||||
*/
|
||||
public async addInterest(
|
||||
interestId: DTInterestId,
|
||||
defaultFullfillmentArg?: DTInterestFullfillment
|
||||
): Promise<Interest<DTInterestId, DTInterestFullfillment>> {
|
||||
const comparisonString = this.comparisonFunc(interestId);
|
||||
let returnInterest: Interest<DTInterestId, DTInterestFullfillment>;
|
||||
const newInterest = new Interest<DTInterestId, DTInterestFullfillment>(
|
||||
this,
|
||||
interestId,
|
||||
this.comparisonFunc,
|
||||
{
|
||||
markLostAfterDefault: this.options.markLostAfterDefault,
|
||||
defaultFullfillment: defaultFullfillmentArg,
|
||||
}
|
||||
);
|
||||
let interestExists = false;
|
||||
await this.interestObjectMap.forEach((interestArg) => {
|
||||
if (!interestExists && interestArg.comparisonString === newInterest.comparisonString) {
|
||||
console.log('info', `interest already exists for ${newInterest.comparisonString}`);
|
||||
interestExists = true;
|
||||
returnInterest = interestArg;
|
||||
returnInterest.renew();
|
||||
}
|
||||
});
|
||||
if (!returnInterest) {
|
||||
returnInterest = newInterest;
|
||||
this.interestObjectMap.add(returnInterest);
|
||||
}
|
||||
this.interestObservable.push(returnInterest);
|
||||
return returnInterest;
|
||||
}
|
||||
|
||||
public interestObservable = new plugins.smartrx.ObservableIntake<Interest<DTInterestId, any>>();
|
||||
|
||||
/**
|
||||
* removes an interest from the interest map
|
||||
*/
|
||||
public removeInterest(interestArg: Interest<DTInterestId, DTInterestFullfillment>) {
|
||||
const interestToRemove = this.interestObjectMap.findOneAndRemoveSync((interestArg2) => {
|
||||
return interestArg.comparisonString === interestArg2.comparisonString;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* check interest
|
||||
*/
|
||||
public checkInterest(objectArg: DTInterestId): boolean {
|
||||
const comparisonString = this.comparisonFunc(objectArg);
|
||||
return this.checkInterestByString(comparisonString);
|
||||
}
|
||||
|
||||
/**
|
||||
* checks an interest
|
||||
* @param comparisonStringArg
|
||||
*/
|
||||
public checkInterestByString(comparisonStringArg: string): boolean {
|
||||
const foundInterest = this.interestObjectMap.findSync((interest) => {
|
||||
return interest.comparisonString === comparisonStringArg;
|
||||
});
|
||||
if (foundInterest) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* inform lost interest
|
||||
* @param interestId
|
||||
*/
|
||||
public informLostInterest(interestId: DTInterestId) {
|
||||
const wantedInterest = this.findInterest(interestId);
|
||||
if (wantedInterest) {
|
||||
wantedInterest.markLost();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* finds an interest
|
||||
* @param interestId
|
||||
*/
|
||||
public findInterest(interestId: DTInterestId): Interest<DTInterestId, DTInterestFullfillment> {
|
||||
const comparableString = this.comparisonFunc(interestId);
|
||||
const interest = this.interestObjectMap.findSync((interestArg) => {
|
||||
return interestArg.comparisonString === comparableString;
|
||||
});
|
||||
return interest; // if an interest is found, the interest is returned, otherwise interest is null
|
||||
}
|
||||
}
|
42
ts/classes.limitedarray.ts
Normal file
42
ts/classes.limitedarray.ts
Normal file
@ -0,0 +1,42 @@
|
||||
import * as plugins from './classes.plugins.js';
|
||||
|
||||
export class LimitedArray<T> {
|
||||
array: T[] = [];
|
||||
arrayLimit: number;
|
||||
constructor(limitArg: number) {
|
||||
this.arrayLimit = limitArg;
|
||||
}
|
||||
|
||||
addOne(objectArg: T) {
|
||||
this.array.unshift(objectArg);
|
||||
if (this.array.length > this.arrayLimit) {
|
||||
this.array.length = this.arrayLimit;
|
||||
}
|
||||
}
|
||||
|
||||
addMany(objectArrayArg: T[]) {
|
||||
for (let objectArg of objectArrayArg) {
|
||||
this.addOne(objectArg);
|
||||
}
|
||||
}
|
||||
|
||||
setLimit(limitArg: number) {
|
||||
this.arrayLimit = limitArg;
|
||||
if (this.array.length > this.arrayLimit) {
|
||||
this.array.length = this.arrayLimit;
|
||||
}
|
||||
}
|
||||
|
||||
getAverage(): number {
|
||||
if (typeof this.array[0] === 'number') {
|
||||
let sum = 0;
|
||||
for (let localNumber of this.array) {
|
||||
let localNumberAny: any = localNumber;
|
||||
sum = sum + localNumberAny;
|
||||
}
|
||||
return sum / this.array.length;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
23
ts/classes.looptracker.ts
Normal file
23
ts/classes.looptracker.ts
Normal file
@ -0,0 +1,23 @@
|
||||
import * as plugins from './classes.plugins.js';
|
||||
|
||||
import { ObjectMap } from './classes.objectmap.js';
|
||||
|
||||
export class LoopTracker<T> {
|
||||
referenceObjectMap = new ObjectMap<any>();
|
||||
constructor() {
|
||||
// nothing here
|
||||
}
|
||||
|
||||
/**
|
||||
* checks and tracks an object
|
||||
* @param objectArg
|
||||
*/
|
||||
checkAndTrack(objectArg: T): boolean {
|
||||
if (!this.referenceObjectMap.checkForObject(objectArg)) {
|
||||
this.referenceObjectMap.add(objectArg);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
246
ts/classes.objectmap.ts
Normal file
246
ts/classes.objectmap.ts
Normal file
@ -0,0 +1,246 @@
|
||||
import * as plugins from './classes.plugins.js';
|
||||
import { FastMap } from './classes.fastmap.js';
|
||||
|
||||
export const uni = (prefix: string = 'uni') => {
|
||||
return `${prefix}xxxxxxxxxxx`.replace(/[xy]/g, (c) => {
|
||||
const r = (Math.random() * 16) | 0;
|
||||
const v = c === 'x' ? r : (r & 0x3) | 0x8;
|
||||
return v.toString(16);
|
||||
});
|
||||
};
|
||||
|
||||
export interface IObjectmapForEachFunction<T> {
|
||||
(itemArg: T): void;
|
||||
}
|
||||
|
||||
export interface IObjectmapFindFunctionSync<T> {
|
||||
(itemArg: T): boolean;
|
||||
}
|
||||
|
||||
export interface IObjectmapFindFunction<T> {
|
||||
(itemArg: T): Promise<boolean>;
|
||||
}
|
||||
|
||||
export interface IObjectMapEventData<T> {
|
||||
operation: 'add' | 'remove';
|
||||
payload: T;
|
||||
}
|
||||
|
||||
/**
|
||||
* allows keeping track of objects
|
||||
*/
|
||||
export class ObjectMap<T> {
|
||||
private fastMap = new FastMap<T>();
|
||||
|
||||
// events
|
||||
public eventSubject = new plugins.smartrx.rxjs.Subject<IObjectMapEventData<T>>();
|
||||
|
||||
/**
|
||||
* returns a new instance
|
||||
*/
|
||||
constructor() {
|
||||
// nothing here
|
||||
}
|
||||
|
||||
/**
|
||||
* adds an object mapped to a string
|
||||
* the string must be unique
|
||||
*/
|
||||
addMappedUnique(uniqueKeyArg: string, objectArg: T) {
|
||||
this.fastMap.addToMap(uniqueKeyArg, objectArg);
|
||||
}
|
||||
|
||||
/**
|
||||
* fastest way to get an object from the map
|
||||
* @param uniqueKey
|
||||
*/
|
||||
public getMappedUnique(uniqueKeyArg: string) {
|
||||
return this.fastMap.getByKey(uniqueKeyArg);
|
||||
}
|
||||
|
||||
/**
|
||||
* remove key
|
||||
* @param functionArg
|
||||
*/
|
||||
public removeMappedUnique(uniqueKey: string) {
|
||||
const object = this.getMappedUnique(uniqueKey);
|
||||
}
|
||||
|
||||
/**
|
||||
* add object to Objectmap
|
||||
* returns false if the object is already in the map
|
||||
* returns true if the object was added successfully
|
||||
*/
|
||||
public add(objectArg: T): string {
|
||||
// lets search for an existing unique key
|
||||
for (const keyArg of this.fastMap.getKeys()) {
|
||||
const object = this.fastMap.getByKey(keyArg);
|
||||
if (object === objectArg) {
|
||||
return keyArg;
|
||||
}
|
||||
}
|
||||
|
||||
// otherwise lets create it
|
||||
const uniqueKey = uni('key');
|
||||
this.addMappedUnique(uniqueKey, objectArg);
|
||||
this.eventSubject.next({
|
||||
operation: 'add',
|
||||
payload: objectArg,
|
||||
});
|
||||
return uniqueKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* like .add but adds an whole array of objects
|
||||
*/
|
||||
public addArray(objectArrayArg: T[]) {
|
||||
for (const item of objectArrayArg) {
|
||||
this.add(item);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* check if object is in Objectmap
|
||||
*/
|
||||
public checkForObject(objectArg: T): boolean {
|
||||
return !!this.getKeyForObject(objectArg);
|
||||
}
|
||||
|
||||
/**
|
||||
* get key for object
|
||||
* @param findFunction
|
||||
*/
|
||||
public getKeyForObject(objectArg: T) {
|
||||
let foundKey: string = null;
|
||||
for (const keyArg of this.fastMap.getKeys()) {
|
||||
if (!foundKey && this.fastMap.getByKey(keyArg) === objectArg) {
|
||||
foundKey = keyArg;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
return foundKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* find object
|
||||
*/
|
||||
public async find(findFunction: IObjectmapFindFunction<T>): Promise<T> {
|
||||
return this.fastMap.find(findFunction);
|
||||
}
|
||||
|
||||
public findSync(findFunction: IObjectmapFindFunctionSync<T>): T {
|
||||
for (const keyArg of this.fastMap.getKeys()) {
|
||||
if (findFunction(this.fastMap.getByKey(keyArg))) {
|
||||
return this.getMappedUnique(keyArg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* finds a specific element and then removes it
|
||||
*/
|
||||
public async findOneAndRemove(findFunction: IObjectmapFindFunction<T>): Promise<T> {
|
||||
const foundElement = await this.find(findFunction);
|
||||
if (foundElement) {
|
||||
this.remove(foundElement);
|
||||
}
|
||||
return foundElement;
|
||||
}
|
||||
public findOneAndRemoveSync(findFunction: IObjectmapFindFunctionSync<T>): T {
|
||||
const foundElement = this.findSync(findFunction);
|
||||
if (foundElement) {
|
||||
this.remove(foundElement);
|
||||
}
|
||||
return foundElement;
|
||||
}
|
||||
|
||||
/**
|
||||
* run function for each item in Objectmap
|
||||
*/
|
||||
public async forEach(functionArg: IObjectmapForEachFunction<T>) {
|
||||
for (const keyArg of this.fastMap.getKeys()) {
|
||||
await functionArg(this.fastMap.getByKey(keyArg));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* gets an object in the Observablemap and removes it, so it can't be retrieved again
|
||||
*/
|
||||
public getOneAndRemove(): T {
|
||||
const keys = this.fastMap.getKeys();
|
||||
if (keys.length === 0) {
|
||||
return null;
|
||||
} else {
|
||||
const keyToUse = keys[0];
|
||||
const removedItem = this.fastMap.removeFromMap(keyToUse);
|
||||
this.eventSubject.next({
|
||||
operation: 'remove',
|
||||
payload: removedItem,
|
||||
});
|
||||
return removedItem;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* returns a cloned array of all the objects currently in the Objectmap
|
||||
*/
|
||||
public getArray(): T[] {
|
||||
const returnArray: any[] = [];
|
||||
for (const keyArg of this.fastMap.getKeys()) {
|
||||
returnArray.push(this.fastMap.getByKey(keyArg));
|
||||
}
|
||||
return returnArray;
|
||||
}
|
||||
|
||||
/**
|
||||
* check if Objectmap ist empty
|
||||
*/
|
||||
public isEmpty(): boolean {
|
||||
return this.fastMap.getKeys().length === 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* remove object from Objectmap
|
||||
*/
|
||||
public remove(objectArg: T): T {
|
||||
if (this.checkForObject(objectArg)) {
|
||||
const keyArg = this.getKeyForObject(objectArg);
|
||||
const removedObject = this.fastMap.removeFromMap(keyArg);
|
||||
this.eventSubject.next({
|
||||
operation: 'remove',
|
||||
payload: removedObject,
|
||||
});
|
||||
return removedObject;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* wipe Objectmap
|
||||
*/
|
||||
public wipe() {
|
||||
for (const keyArg of this.fastMap.getKeys()) {
|
||||
this.fastMap.removeFromMap(keyArg);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* returns a new Objectmap that includes
|
||||
*/
|
||||
public concat(objectMapArg: ObjectMap<T>) {
|
||||
const concattedObjectMap = new ObjectMap<T>();
|
||||
concattedObjectMap.fastMap.addAllFromOther(this.fastMap);
|
||||
concattedObjectMap.fastMap.addAllFromOther(objectMapArg.fastMap);
|
||||
return concattedObjectMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* tries to merge another Objectmap
|
||||
* Note: uniqueKeyCollisions will cause overwrite
|
||||
* @param objectMapArg
|
||||
*/
|
||||
public addAllFromOther(objectMapArg: ObjectMap<T>) {
|
||||
this.fastMap.addAllFromOther(objectMapArg.fastMap);
|
||||
}
|
||||
}
|
17
ts/classes.plugins.ts
Normal file
17
ts/classes.plugins.ts
Normal file
@ -0,0 +1,17 @@
|
||||
// ==============
|
||||
// @pushrocks
|
||||
// ==============
|
||||
import * as smartdelay from '@push.rocks/smartdelay';
|
||||
import * as smartmatch from '@push.rocks/smartmatch';
|
||||
import * as smartpromise from '@push.rocks/smartpromise';
|
||||
import * as smartrx from '@push.rocks/smartrx';
|
||||
import * as smarttime from '@push.rocks/smarttime';
|
||||
|
||||
export { smartdelay, smartmatch, smartpromise, smartrx, smarttime };
|
||||
|
||||
// ==============
|
||||
// third party
|
||||
// ==============
|
||||
import symbolTree from 'symbol-tree';
|
||||
|
||||
export { symbolTree };
|
119
ts/classes.stringmap.ts
Normal file
119
ts/classes.stringmap.ts
Normal file
@ -0,0 +1,119 @@
|
||||
import * as plugins from './classes.plugins.js';
|
||||
|
||||
/**
|
||||
* allows you to easily keep track of a bunch of strings
|
||||
*/
|
||||
|
||||
export type TTriggerFunction = (stringArray?: string[]) => boolean;
|
||||
|
||||
export class Stringmap {
|
||||
private _stringArray: string[] = [];
|
||||
private _triggerUntilTrueFunctionArray: TTriggerFunction[] = [];
|
||||
constructor() {}
|
||||
/**
|
||||
* add a string to the Stringmap
|
||||
*/
|
||||
addString(stringArg: string) {
|
||||
this._stringArray.push(stringArg);
|
||||
this.notifyTrigger();
|
||||
}
|
||||
|
||||
/**
|
||||
* like addString, but accepts an array of strings
|
||||
*/
|
||||
addStringArray(stringArrayArg: string[]) {
|
||||
for (const stringItem of stringArrayArg) {
|
||||
this.addString(stringItem);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* removes a string from Stringmap
|
||||
*/
|
||||
removeString(stringArg: string) {
|
||||
for (const keyArg in this._stringArray) {
|
||||
if (this._stringArray[keyArg] === stringArg) {
|
||||
this._stringArray.splice(parseInt(keyArg), 1);
|
||||
}
|
||||
}
|
||||
this.notifyTrigger();
|
||||
}
|
||||
|
||||
/**
|
||||
* wipes the Stringmap
|
||||
*/
|
||||
wipe() {
|
||||
this._stringArray = [];
|
||||
this.notifyTrigger();
|
||||
}
|
||||
|
||||
/**
|
||||
* check if string is in Stringmap
|
||||
*/
|
||||
public checkString(stringArg: string): boolean {
|
||||
return this._stringArray.indexOf(stringArg) !== -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* checks stringPresence with minimatch
|
||||
*/
|
||||
public checkMinimatch(miniMatchStringArg: string): boolean {
|
||||
const smartMatchInstance = new plugins.smartmatch.SmartMatch(miniMatchStringArg);
|
||||
let foundMatch: boolean = false;
|
||||
for (const stringItem of this._stringArray) {
|
||||
if (smartMatchInstance.match(stringItem)) {
|
||||
foundMatch = true;
|
||||
}
|
||||
}
|
||||
return foundMatch;
|
||||
}
|
||||
|
||||
/**
|
||||
* checks if the Stringmap is empty
|
||||
*/
|
||||
public checkIsEmpty() {
|
||||
return this._stringArray.length === 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* gets a cloned copy of the current string Array
|
||||
*/
|
||||
public getStringArray() {
|
||||
const returnArray: string[] = [];
|
||||
for (const stringItem of this._stringArray) {
|
||||
returnArray.push(stringItem);
|
||||
}
|
||||
return returnArray;
|
||||
}
|
||||
|
||||
// trigger registering
|
||||
|
||||
/**
|
||||
* register a new trigger
|
||||
*/
|
||||
public registerUntilTrue(functionArg: TTriggerFunction, callbackArg?: () => any) {
|
||||
const trueDeferred = plugins.smartpromise.defer();
|
||||
this._triggerUntilTrueFunctionArray.push(() => {
|
||||
const result = functionArg(this.getStringArray());
|
||||
if (result === true) {
|
||||
if (callbackArg) {
|
||||
callbackArg();
|
||||
}
|
||||
trueDeferred.resolve();
|
||||
}
|
||||
return result;
|
||||
});
|
||||
this.notifyTrigger();
|
||||
return trueDeferred.promise;
|
||||
}
|
||||
|
||||
/**
|
||||
* notifies triggers
|
||||
*/
|
||||
private notifyTrigger() {
|
||||
const filteredArray = this._triggerUntilTrueFunctionArray.filter((functionArg) => {
|
||||
return !functionArg();
|
||||
});
|
||||
this._triggerUntilTrueFunctionArray = filteredArray;
|
||||
}
|
||||
}
|
41
ts/classes.timedaggregator.ts
Normal file
41
ts/classes.timedaggregator.ts
Normal file
@ -0,0 +1,41 @@
|
||||
import * as plugins from './classes.plugins.js';
|
||||
|
||||
export interface ITimedAggregatorOptions<T> {
|
||||
aggregationIntervalInMillis: number;
|
||||
functionForAggregation: (input: T[]) => void;
|
||||
}
|
||||
|
||||
export class TimedAggregtor<T> {
|
||||
public options: ITimedAggregatorOptions<T>;
|
||||
private storageArray: T[] = [];
|
||||
|
||||
constructor(optionsArg: ITimedAggregatorOptions<T>) {
|
||||
this.options = optionsArg;
|
||||
}
|
||||
|
||||
private aggregationTimer: plugins.smarttime.Timer;
|
||||
private checkAggregationStatus() {
|
||||
const addAggregationTimer = () => {
|
||||
this.aggregationTimer = new plugins.smarttime.Timer(this.options.aggregationIntervalInMillis);
|
||||
this.aggregationTimer.completed.then(() => {
|
||||
const aggregateForProcessing = this.storageArray;
|
||||
if (aggregateForProcessing.length === 0) {
|
||||
this.aggregationTimer = null;
|
||||
return;
|
||||
}
|
||||
this.storageArray = [];
|
||||
addAggregationTimer();
|
||||
this.options.functionForAggregation(aggregateForProcessing);
|
||||
});
|
||||
this.aggregationTimer.start();
|
||||
};
|
||||
if (!this.aggregationTimer) {
|
||||
addAggregationTimer();
|
||||
}
|
||||
}
|
||||
|
||||
public add(aggregationArg: T) {
|
||||
this.storageArray.push(aggregationArg);
|
||||
this.checkAggregationStatus();
|
||||
}
|
||||
}
|
141
ts/classes.tree.ts
Normal file
141
ts/classes.tree.ts
Normal file
@ -0,0 +1,141 @@
|
||||
import * as plugins from './classes.plugins.js';
|
||||
|
||||
export class Tree<T> {
|
||||
symbolTree: any;
|
||||
constructor() {
|
||||
this.symbolTree = new plugins.symbolTree();
|
||||
}
|
||||
|
||||
// =======================================
|
||||
// Functions that map to the functionality of symbol-tree
|
||||
// =======================================
|
||||
|
||||
/**
|
||||
*
|
||||
* @param objectArg
|
||||
*/
|
||||
initialize(objectArg: T): T {
|
||||
return this.symbolTree.initialize(objectArg);
|
||||
}
|
||||
|
||||
hasChildren(objectArg: T): boolean {
|
||||
return this.symbolTree.hasChildren(objectArg);
|
||||
}
|
||||
|
||||
firstChild(objectArg: T): T {
|
||||
return this.symbolTree.firstChild(objectArg);
|
||||
}
|
||||
|
||||
lastChild(objectArg: T): T {
|
||||
return this.symbolTree.lastChild(objectArg);
|
||||
}
|
||||
|
||||
previousSibling(objectArg: T): T {
|
||||
return this.symbolTree.previousSibling(objectArg);
|
||||
}
|
||||
|
||||
nextSibling(objectArg: T): T {
|
||||
return this.symbolTree.nextSibling(objectArg);
|
||||
}
|
||||
|
||||
parent(objectArg: T): T {
|
||||
return this.symbolTree.parent(objectArg);
|
||||
}
|
||||
|
||||
lastInclusiveDescendant(objectArg: T): T {
|
||||
return this.symbolTree.lastInclusiveDescendant(objectArg);
|
||||
}
|
||||
|
||||
preceding(objectArg: T, optionsArg?: any): T {
|
||||
return this.symbolTree.preceding(objectArg, optionsArg);
|
||||
}
|
||||
|
||||
following(object: T, optionsArg: any) {
|
||||
return this.symbolTree.following(object, optionsArg);
|
||||
}
|
||||
|
||||
childrenToArray(parentArg: T, optionsArg: any): T[] {
|
||||
return this.symbolTree.childrenToArray(parentArg, optionsArg);
|
||||
}
|
||||
|
||||
ancestorsToArray(objectArg: T, optionsArg: any): T[] {
|
||||
return this.symbolTree.ancestorsToArray(objectArg, optionsArg);
|
||||
}
|
||||
|
||||
treeToArray(rootArg: T, optionsArg: any): T[] {
|
||||
return this.symbolTree.treeToArray(rootArg, optionsArg);
|
||||
}
|
||||
|
||||
childrenIterator(parentArg: T, optionsArg: any): T {
|
||||
return this.symbolTree.childrenIterator(parentArg, optionsArg);
|
||||
}
|
||||
|
||||
previousSiblingsIterator(objectArg: T): T {
|
||||
return this.symbolTree.previousSiblingsIterator(objectArg);
|
||||
}
|
||||
|
||||
nextSiblingsIterator(objectArg: T) {
|
||||
return this.symbolTree.nextSiblingsIterator();
|
||||
}
|
||||
|
||||
ancestorsIterator(objectArg: T) {
|
||||
this.symbolTree.ancestorsIterator();
|
||||
}
|
||||
|
||||
treeIterator(rootArg: T, optionsArg: any): Iterable<T> {
|
||||
return this.symbolTree.treeIterator(rootArg);
|
||||
}
|
||||
|
||||
index(childArg: T): number {
|
||||
return this.symbolTree.index(childArg);
|
||||
}
|
||||
|
||||
childrenCount(parentArg: T): number {
|
||||
return this.symbolTree.childrenCount(parentArg);
|
||||
}
|
||||
|
||||
compareTreePosition(leftArg: T, rightArg: T): number {
|
||||
return this.compareTreePosition(leftArg, rightArg);
|
||||
}
|
||||
|
||||
remove(removeObjectArg: T): T {
|
||||
return this.symbolTree.remove(removeObjectArg);
|
||||
}
|
||||
|
||||
insertBefore(referenceObjectArg: T, newObjectArg: T): T {
|
||||
return this.symbolTree.insertBefore(referenceObjectArg, newObjectArg);
|
||||
}
|
||||
|
||||
insertAfter(referenceObject: T, newObjectArg: T) {
|
||||
return this.symbolTree.insertAfter(referenceObject, newObjectArg);
|
||||
}
|
||||
|
||||
prependChild(referenceObjectArg: T, newObjectArg: T): T {
|
||||
return this.symbolTree.prependChild(referenceObjectArg, newObjectArg);
|
||||
}
|
||||
|
||||
appendChild(referenceObjectArg: T, newObjectArg: T) {
|
||||
return this.symbolTree.appendChild(referenceObjectArg, newObjectArg);
|
||||
}
|
||||
|
||||
// ===========================================
|
||||
// Functionionality that extends symbol-tree
|
||||
// ===========================================
|
||||
|
||||
/**
|
||||
* returns a branch of the tree as JSON
|
||||
* can be user
|
||||
*/
|
||||
toJsonWithHierachy(rootElement: T) {
|
||||
const treeIterable = this.treeIterator(rootElement, {});
|
||||
for (const treeItem of treeIterable) {
|
||||
console.log(treeItem);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* builds a tree from a JSON with hierachy
|
||||
* @param rootElement
|
||||
*/
|
||||
fromJsonWithHierachy(rootElement: T) {}
|
||||
}
|
16
ts/index.ts
16
ts/index.ts
@ -1,5 +1,11 @@
|
||||
import * as plugins from "./lik.plugins";
|
||||
|
||||
// import modules
|
||||
|
||||
export * from "./lik.stringmap";
|
||||
export * from './classes.asyncexecutionstack.js';
|
||||
export * from './classes.backpressuredarray.js';
|
||||
export * from './classes.fastmap.js';
|
||||
export * from './classes.interestmap.js';
|
||||
export * from './classes.interestmap.interest.js';
|
||||
export * from './classes.limitedarray.js';
|
||||
export * from './classes.looptracker.js';
|
||||
export * from './classes.objectmap.js';
|
||||
export * from './classes.stringmap.js';
|
||||
export * from './classes.timedaggregator.js';
|
||||
export * from './classes.tree.js';
|
||||
|
@ -1,3 +0,0 @@
|
||||
import "typings-global";
|
||||
export import q = require("q");
|
||||
export import minimatch = require("minimatch");
|
@ -1,99 +0,0 @@
|
||||
import * as plugins from "./lik.plugins";
|
||||
|
||||
/**
|
||||
* allows you to easily keep track of a bunch of strings;
|
||||
*/
|
||||
|
||||
export interface triggerFunction {
|
||||
():boolean;
|
||||
}
|
||||
|
||||
export class Stringmap {
|
||||
private _stringArray:string[] = [];
|
||||
private _triggerUntilTrueFunctionArray:triggerFunction[] = [];
|
||||
constructor(){
|
||||
|
||||
};
|
||||
/**
|
||||
* add a string to the Stringmap
|
||||
*/
|
||||
addString(stringArg:string){
|
||||
this._stringArray.push(stringArg);
|
||||
this.notifyTrigger();
|
||||
};
|
||||
|
||||
/**
|
||||
* removes a string from Stringmap
|
||||
*/
|
||||
removeString(stringArg:string){
|
||||
for (let keyArg in this._stringArray){
|
||||
if(this._stringArray[keyArg] == stringArg){
|
||||
this._stringArray.splice(parseInt(keyArg),1);
|
||||
};
|
||||
};
|
||||
this.notifyTrigger();
|
||||
}
|
||||
|
||||
/**
|
||||
* wipes the Stringmap
|
||||
*/
|
||||
wipe(){
|
||||
this._stringArray = [];
|
||||
this.notifyTrigger();
|
||||
}
|
||||
|
||||
/**
|
||||
* check if string is in Stringmap
|
||||
*/
|
||||
checkString(stringArg:string):boolean {
|
||||
return this._stringArray.indexOf(stringArg) != -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* checks stringPresence with minimatch
|
||||
*/
|
||||
checkMinimatch(miniMatchStringArg:string):boolean {
|
||||
let foundMatch:boolean = false;
|
||||
for(let stringItem of this._stringArray){
|
||||
if(plugins.minimatch(stringItem,miniMatchStringArg)){
|
||||
foundMatch = true;
|
||||
};
|
||||
};
|
||||
return foundMatch;
|
||||
};
|
||||
|
||||
/**
|
||||
* checks if the Stringmap is empty
|
||||
*/
|
||||
checkIsEmpty(){
|
||||
return (this._stringArray.length == 0);
|
||||
}
|
||||
|
||||
// trigger registering
|
||||
|
||||
/**
|
||||
* notifies triggers
|
||||
*/
|
||||
private notifyTrigger(){
|
||||
let filteredArray = this._triggerUntilTrueFunctionArray.filter((functionArg) => {
|
||||
return !functionArg();
|
||||
});
|
||||
this._triggerUntilTrueFunctionArray = filteredArray;
|
||||
};
|
||||
|
||||
/**
|
||||
* register a new trigger
|
||||
*/
|
||||
registerUntilTrue(functionArg:triggerFunction,doFunctionArg){
|
||||
this._triggerUntilTrueFunctionArray.push(
|
||||
() => {
|
||||
let result = functionArg();
|
||||
if(result == true){
|
||||
doFunctionArg();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
);
|
||||
this.notifyTrigger();
|
||||
}
|
||||
}
|
14
tsconfig.json
Normal file
14
tsconfig.json
Normal file
@ -0,0 +1,14 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"experimentalDecorators": true,
|
||||
"useDefineForClassFields": false,
|
||||
"target": "ES2022",
|
||||
"module": "NodeNext",
|
||||
"moduleResolution": "NodeNext",
|
||||
"esModuleInterop": true,
|
||||
"verbatimModuleSyntax": true
|
||||
},
|
||||
"exclude": [
|
||||
"dist_*/**/*.d.ts"
|
||||
]
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user