Compare commits

...

119 Commits

Author SHA1 Message Date
5d9624bd56 6.1.0 2024-10-13 20:40:40 +02:00
32397a97cd feat(BackpressuredArray): Add method to check if items are present in BackpressuredArray 2024-10-13 20:40:40 +02:00
753b829d18 update description 2024-05-29 14:11:13 +02:00
4be2784bf4 6.0.15 2024-04-18 21:55:34 +02:00
cd08cf370c fix(core): update 2024-04-18 21:55:33 +02:00
b64fe567a8 update tsconfig 2024-04-14 13:39:10 +02:00
2a68c9ad90 update npmextra.json: githost 2024-04-01 21:33:17 +02:00
aa978413d1 update npmextra.json: githost 2024-04-01 19:57:26 +02:00
f24636ba80 update npmextra.json: githost 2024-03-30 21:46:23 +01:00
5e31dbb504 6.0.14 2024-02-25 13:01:07 +01:00
b2ca6e13e7 fix(core): update 2024-02-25 13:01:06 +01:00
052322fb98 6.0.13 2024-02-23 17:44:52 +01:00
9e1eb0b3a0 fix(core): update 2024-02-23 17:44:51 +01:00
af9b045d31 6.0.12 2023-11-13 17:20:46 +01:00
d7718d4340 fix(core): update 2023-11-13 17:20:45 +01:00
92592d9e9a 6.0.11 2023-11-13 16:44:39 +01:00
a786c43970 fix(core): update 2023-11-13 16:44:38 +01:00
66658dc877 6.0.10 2023-11-13 16:43:07 +01:00
be78d74124 fix(core): update 2023-11-13 16:43:06 +01:00
bde0404777 6.0.9 2023-11-13 16:27:05 +01:00
dfe973f5d8 fix(core): update 2023-11-13 16:27:04 +01:00
326030456f 6.0.8 2023-11-13 14:59:04 +01:00
184dc98127 fix(core): update 2023-11-13 14:59:03 +01:00
702ce00288 6.0.7 2023-11-13 14:40:02 +01:00
ff0d745170 fix(core): update 2023-11-13 14:40:01 +01:00
8fc0438c75 6.0.6 2023-11-09 21:17:14 +01:00
355c2d132e fix(core): update 2023-11-09 21:17:13 +01:00
c083a47f07 6.0.5 2023-08-14 19:31:21 +02:00
9eb9403bea fix(core): update 2023-08-14 19:31:21 +02:00
029f2a6872 6.0.4 2023-08-14 19:27:29 +02:00
66676d89a5 fix(core): update 2023-08-14 19:27:28 +02:00
775a307056 6.0.3 2023-07-12 10:07:36 +02:00
4aa7621401 fix(core): update 2023-07-12 10:07:35 +02:00
b7ac5cb864 switch to new org scheme 2023-07-11 00:00:55 +02:00
f580281ccd switch to new org scheme 2023-07-10 02:41:33 +02:00
cc66f81c7e 6.0.2 2023-01-18 17:45:20 +01:00
6f1e32284d fix(core): update 2023-01-18 17:45:19 +01:00
47b511f1f0 6.0.1 2023-01-18 12:18:48 +01:00
24f82fe570 fix(core): update 2023-01-18 12:18:47 +01:00
60a0fab9db 6.0.0 2022-05-27 17:58:02 +02:00
61e287fbe4 BREAKING CHANGE(core): switch to esm 2022-05-27 17:58:02 +02:00
984297c9c3 5.0.6 2022-05-27 17:57:14 +02:00
55e4edc785 fix(core): update 2022-05-27 17:57:14 +02:00
0fdc891326 5.0.5 2022-05-27 17:53:02 +02:00
69ab47ed41 fix(core): update 2022-05-27 17:53:02 +02:00
b1bd8132de 5.0.4 2022-01-24 21:54:16 +01:00
4e672b13f4 fix(core): update 2022-01-24 21:54:16 +01:00
75c2f23d02 5.0.3 2022-01-24 07:45:40 +01:00
da0c459d74 fix(core): update 2022-01-24 07:45:38 +01:00
079b093e2c 5.0.2 2022-01-24 07:16:28 +01:00
55a3caec44 fix(core): update 2022-01-24 07:16:27 +01:00
28b3666aad 5.0.1 2022-01-24 05:22:51 +01:00
b17dd2ed64 fix(core): update 2022-01-24 05:22:49 +01:00
e551a68237 5.0.0 2021-09-21 16:34:12 +02:00
f402e55ff3 BREAKING CHANGE(objectmap): switch to async behaviours 2021-09-21 16:34:12 +02:00
15b8fe406a 4.0.22 2021-09-12 16:08:20 +02:00
c7557163cd fix(core): update 2021-09-12 16:08:20 +02:00
f84822dd5d 4.0.21 2021-09-12 15:39:47 +02:00
21d6e19a22 fix(core): update 2021-09-12 15:39:47 +02:00
8947738dc1 4.0.20 2020-11-24 19:11:43 +00:00
14bc5dcd25 fix(core): update 2020-11-24 19:11:42 +00:00
c2f366de7f 4.0.19 2020-11-24 18:53:28 +00:00
ae47276569 fix(core): update 2020-11-24 18:53:28 +00:00
42b59c109d 4.0.18 2020-11-24 18:47:46 +00:00
8f18faaf1c fix(core): update 2020-11-24 18:47:45 +00:00
ccd5b80d67 4.0.17 2020-07-14 10:55:49 +00:00
298904e17e fix(core): update 2020-07-14 10:55:48 +00:00
fa91e67aef 4.0.16 2020-07-14 08:58:30 +00:00
5e99066bee fix(core): update 2020-07-14 08:58:30 +00:00
a838f7eb80 4.0.15 2020-07-14 01:11:49 +00:00
979e93be27 fix(core): update 2020-07-14 01:11:48 +00:00
60587f052c 4.0.14 2020-07-12 00:44:51 +00:00
da5bd43a42 fix(core): update 2020-07-12 00:44:50 +00:00
24559d1582 4.0.13 2020-05-27 23:50:08 +00:00
d92657b130 fix(core): update 2020-05-27 23:50:07 +00:00
f8f34bf8a3 4.0.12 2020-05-27 20:22:46 +00:00
861d2c04b3 fix(core): update 2020-05-27 20:22:45 +00:00
5845d74160 4.0.11 2020-05-27 20:07:28 +00:00
9dd952e6b7 fix(core): update 2020-05-27 20:07:28 +00:00
742a711359 4.0.10 2020-05-27 18:54:07 +00:00
8878a0ef8b fix(core): update 2020-05-27 18:54:07 +00:00
6a52e81cdd 4.0.9 2020-05-27 18:41:22 +00:00
757e709f3f fix(core): update 2020-05-27 18:41:22 +00:00
e0d9c3a3e0 4.0.8 2020-05-27 18:22:40 +00:00
150953adaf fix(core): update 2020-05-27 18:22:40 +00:00
e0eba5d206 4.0.7 2020-05-27 18:15:14 +00:00
d9eb836f98 fix(core): update 2020-05-27 18:15:14 +00:00
6d29798660 4.0.6 2020-05-26 00:06:34 +00:00
f80a84086c fix(core): update 2020-05-26 00:06:34 +00:00
929a6eff07 4.0.5 2020-05-25 22:18:42 +00:00
87243881bb fix(core): update 2020-05-25 22:18:41 +00:00
5d51c14bd6 4.0.4 2020-05-25 22:04:22 +00:00
453c6d6ae8 fix(core): update 2020-05-25 22:04:21 +00:00
2e9fe308df 4.0.3 2020-05-25 18:10:10 +00:00
96a71638a0 fix(core): update 2020-05-25 18:10:10 +00:00
1c7582d328 4.0.2 2020-05-25 15:38:58 +00:00
ccff9b39be fix(core): update 2020-05-25 15:38:57 +00:00
749be9ac60 4.0.1 2020-05-25 13:18:53 +00:00
7c9ad26519 fix(core): update 2020-05-25 13:18:53 +00:00
6fdf08c8a9 4.0.0 2020-05-04 00:09:21 +00:00
de04d75e18 BREAKING CHANGE(core): refactored ObjectMap and introduced concat feature 2020-05-04 00:09:20 +00:00
5159d7e4bf 3.0.19 2020-02-16 23:15:51 +00:00
7b78aaea72 fix(FastMap): added .clean() method 2020-02-16 23:15:50 +00:00
54a63d1f41 3.0.18 2020-02-15 21:25:50 +00:00
dd5a009d0f fix(core): update 2020-02-15 21:25:49 +00:00
e7933cd7f4 3.0.17 2020-02-07 16:32:58 +00:00
56a8d9182b fix(core): update 2020-02-07 16:32:58 +00:00
3a971301a4 3.0.16 2020-02-06 15:31:59 +00:00
b880036b64 fix(Objectmap): switch to an object map with unique keys 2020-02-06 15:31:58 +00:00
9d756dbff7 3.0.15 2020-02-06 11:11:27 +00:00
b8111c66ff fix(core): update 2020-02-06 11:11:27 +00:00
8d660a8573 3.0.14 2020-02-06 11:11:16 +00:00
596a897afc fix(core): update 2020-02-06 11:11:16 +00:00
e1442b1bc8 3.0.13 2019-11-27 23:15:14 +00:00
2ca9e14f76 fix(core): update 2019-11-27 23:15:13 +00:00
e65f36dfa2 3.0.12 2019-11-27 23:00:16 +00:00
adb95cd683 fix(dependencies): update 2019-11-27 23:00:15 +00:00
d2106690b4 3.0.11 2019-08-25 15:58:01 +02:00
2ea5111eb8 fix(core): update 2019-08-25 15:58:00 +02:00
44 changed files with 6295 additions and 2331 deletions

View 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

View 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

4
.gitignore vendored
View File

@ -15,8 +15,6 @@ node_modules/
# builds
dist/
dist_web/
dist_serve/
dist_ts_web/
dist_*/
# custom

View File

@ -1,119 +0,0 @@
# gitzone ci_default
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
cache:
paths:
- .npmci_cache/
key: "$CI_BUILD_STAGE"
stages:
- security
- test
- release
- metadata
# ====================
# security stage
# ====================
mirror:
stage: security
script:
- npmci git mirror
tags:
- docker
- notpriv
snyk:
stage: security
script:
- npmci npm prepare
- npmci command npm install -g snyk
- npmci command npm install --ignore-scripts
- npmci command snyk test
tags:
- docker
- notpriv
# ====================
# test stage
# ====================
testLTS:
stage: test
script:
- npmci npm prepare
- npmci node install lts
- npmci npm install
- npmci npm test
coverage: /\d+.?\d+?\%\s*coverage/
tags:
- docker
- notpriv
testBuild:
stage: test
script:
- npmci npm prepare
- npmci node install lts
- npmci npm install
- npmci command npm run build
coverage: /\d+.?\d+?\%\s*coverage/
tags:
- docker
- notpriv
release:
stage: release
script:
- npmci node install lts
- npmci npm publish
only:
- tags
tags:
- docker
- notpriv
# ====================
# metadata stage
# ====================
codequality:
stage: metadata
allow_failure: true
script:
- npmci command npm install -g tslint typescript
- npmci npm install
- npmci command "tslint -c tslint.json ./ts/**/*.ts"
tags:
- docker
- priv
trigger:
stage: metadata
script:
- npmci trigger
only:
- tags
tags:
- docker
- notpriv
pages:
image: hosttoday/ht-docker-dbase:npmci
services:
- docker:18-dind
stage: metadata
script:
- npmci command npm install -g @gitzone/tsdoc
- npmci npm prepare
- npmci npm install
- npmci command tsdoc
tags:
- docker
- notpriv
only:
- tags
artifacts:
expire_in: 1 week
paths:
- public
allow_failure: true

11
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,11 @@
{
"version": "0.2.0",
"configurations": [
{
"command": "npm test",
"name": "Run npm test",
"request": "launch",
"type": "node-terminal"
}
]
}

27
.vscode/settings.json vendored
View File

@ -1,3 +1,26 @@
{
"workbench.colorCustomizations": {}
}
"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"]
}
}
}
}
}
}
]
}

View File

@ -1,43 +0,0 @@
# @pushrocks/lik
light little helpers for node
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@pushrocks/lik)
* [gitlab.com (source)](https://gitlab.com/pushrocks/lik)
* [github.com (source mirror)](https://github.com/pushrocks/lik)
* [docs (typedoc)](https://pushrocks.gitlab.io/lik/)
## Status for master
[![build status](https://gitlab.com/pushrocks/lik/badges/master/build.svg)](https://gitlab.com/pushrocks/lik/commits/master)
[![coverage report](https://gitlab.com/pushrocks/lik/badges/master/coverage.svg)](https://gitlab.com/pushrocks/lik/commits/master)
[![npm downloads per month](https://img.shields.io/npm/dm/@pushrocks/lik.svg)](https://www.npmjs.com/package/@pushrocks/lik)
[![Known Vulnerabilities](https://snyk.io/test/npm/@pushrocks/lik/badge.svg)](https://snyk.io/test/npm/@pushrocks/lik)
[![TypeScript](https://img.shields.io/badge/TypeScript->=%203.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
[![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
[![JavaScript Style Guide](https://img.shields.io/badge/code%20style-prettier-ff69b4.svg)](https://prettier.io/)
## 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.
For further information read the linked docs at the top of this readme.
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
[![repo-footer](https://pushrocks.gitlab.io/assets/repo-footer.svg)](https://maintainedby.lossless.com)

55
changelog.md Normal file
View 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

View File

@ -4,13 +4,30 @@
"npmAccessLevel": "public"
},
"gitzone": {
"projectType": "npm",
"module": {
"githost": "gitlab.com",
"gitscope": "pushrocks",
"githost": "code.foss.global",
"gitscope": "push.rocks",
"gitrepo": "lik",
"shortDescription": "light little helpers for node",
"npmPackagename": "@pushrocks/lik",
"license": "MIT"
"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"
}
}

1785
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,51 +1,70 @@
{
"name": "@pushrocks/lik",
"version": "3.0.10",
"name": "@push.rocks/lik",
"version": "6.1.0",
"private": false,
"description": "light little helpers for node",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
"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": "(tstest test/)",
"build": "(tsbuild)"
"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": {
"@gitzone/tsbuild": "^2.1.11",
"@gitzone/tsrun": "^1.2.8",
"@gitzone/tstest": "^1.0.24",
"@pushrocks/tapbundle": "^3.0.11",
"@types/node": "^12.6.9",
"tslint": "^5.18.0",
"tslint-config-prettier": "^1.18.0"
"@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": {
"@pushrocks/smartdelay": "^2.0.3",
"@pushrocks/smartpromise": "^3.0.2",
"@pushrocks/smartrx": "^2.0.3",
"@pushrocks/smarttime": "^3.0.12",
"@types/minimatch": "^3.0.3",
"minimatch": "^3.0.4",
"@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_web/*",
"dist_ts_web/*",
"assets/*",
"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

File diff suppressed because it is too large Load Diff

1
readme.hints.md Normal file
View File

@ -0,0 +1 @@

204
readme.md Normal file
View 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.

View 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();

30
test/test.fastmap.both.ts Normal file
View 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();

View File

@ -1,10 +1,10 @@
import { tap, expect } from '@pushrocks/tapbundle';
import * as lik from '../ts/index';
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 => {
testInterestmap = new lik.InterestMap((numberArg) => {
return numberArg.toString();
});
});
@ -22,4 +22,4 @@ tap.test('should be able to inform about a lost interest', async () => {
testInterestmap.informLostInterest(3);
});
tap.start();
export default tap.start();

View File

@ -1,17 +1,17 @@
import { tap, expect } from '@pushrocks/tapbundle';
import { tap, expect } from '@push.rocks/tapbundle';
import { LimitedArray } from '../ts/index';
import { LimitedArray } from '../ts/index.js';
let testLimitedArray: LimitedArray<string>;
tap.test('should create a LimitedArray', async () => {
testLimitedArray = new LimitedArray(6);
expect(testLimitedArray).to.be.instanceof(LimitedArray);
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).to.be.lessThan(7);
expect(testLimitedArray.array.length < 7).toBeTrue();
});
tap.start();
export default tap.start();

View 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();

View File

@ -1,26 +0,0 @@
// import test framework
import { expect, tap } from '@pushrocks/tapbundle';
import * as events from 'events';
import * as smartpromise from '@pushrocks/smartpromise';
// import the module
import * as lik from '../ts/index';
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).to.be.instanceof(lik.LoopTracker);
});
tap.test('should add objects once and return true', async () => {
expect(myLoopTracker.checkAndTrack(object1)).to.be.true;
expect(myLoopTracker.checkAndTrack(object1)).to.be.false;
expect(myLoopTracker.checkAndTrack(object2)).to.be.true;
expect(myLoopTracker.checkAndTrack(object2)).to.be.false;
});
tap.start();

View File

@ -1,78 +1,76 @@
// import test framework
import { expect, tap } from '@pushrocks/tapbundle';
import * as events from 'events';
import * as smartpromise from '@pushrocks/smartpromise';
import { expect, tap } from '@push.rocks/tapbundle';
// import the module
import * as lik from '../ts/index';
import * as lik from '../ts/index.js';
// Objectmap
interface ITestObject {
propOne: string;
propTwo: string;
}
let testObjectmap: lik.Objectmap<ITestObject>;
let testObjectmap: lik.ObjectMap<ITestObject>;
let testObject1: ITestObject = {
propOne: 'hello',
propTwo: 'hello2'
propTwo: 'hello2',
};
let testObject2: ITestObject = {
propOne: 'hello',
propTwo: 'hello2'
propTwo: 'hello2',
};
tap.test('new lik.Objectmap() -> should correctly instantiate an Objectmap', async () => {
testObjectmap = new lik.Objectmap<ITestObject>();
expect(testObjectmap).be.instanceof(lik.Objectmap);
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)).be.true;
expect(testObjectmap.checkForObject(testObject1)).toBeTrue();
// tslint:disable-next-line:no-unused-expression
expect(testObjectmap.checkForObject(testObject2)).be.false;
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)).be.false;
expect(testObjectmap.checkForObject(testObject1)).toBeFalse();
// tslint:disable-next-line:no-unused-expression
expect(testObjectmap.checkForObject(testObject2)).be.true;
expect(testObjectmap.checkForObject(testObject2)).toBeTrue();
});
tap.test('Objectmap.forEach -> should correctly run a function forEach map object', async () => {
testObjectmap.forEach(itemArg => {
expect(itemArg).to.have.property('propOne');
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 = testObjectmap.find(itemArg => {
let referenceObject = await testObjectmap.find(async (itemArg) => {
return itemArg.propOne === 'helloThere';
});
// tslint:disable-next-line:no-unused-expression
expect(myObject === referenceObject).be.true;
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]).to.eql(myObject);
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.be.null;
expect(testObjectmap.getArray().length).equal(originalLength - 1);
expect(testObjectmap.getArray()).to.not.contain(oneObject);
expect(oneObject).not.toBeNull();
expect(testObjectmap.getArray().length).toEqual(originalLength - 1);
expect(testObjectmap.getArray()).not.toContain(oneObject);
});
tap.start();
export default tap.start();

View File

@ -1,10 +1,8 @@
// import test framework
import { expect, tap } from '@pushrocks/tapbundle';
import * as events from 'events';
import * as smartpromise from '@pushrocks/smartpromise';
import { expect, tap } from '@push.rocks/tapbundle';
// import the module
import * as lik from '../ts/index';
import * as lik from '../ts/index.js';
// testData
let testStringmap: lik.Stringmap;
@ -18,14 +16,14 @@ let testString6 = 'testString6';
// tests
tap.test('new lik.Objectmap() -> should create an instance of Stringmap', async () => {
testStringmap = new lik.Stringmap();
expect(testStringmap).be.instanceof(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)).be.false;
expect(testStringmap.checkString(testString1)).toBeFalse();
}
);
@ -34,37 +32,37 @@ tap.test('lik.Stringmap.addString -> should add an string to Stringmap', async (
testStringmap.addString(testString2);
testStringmap.addString(testString3);
// tslint:disable-next-line:no-unused-expression
expect(testStringmap.checkString(testString1)).be.true;
expect(testStringmap.checkString(testString1)).toBeTrue();
// tslint:disable-next-line:no-unused-expression
expect(testStringmap.checkString(testString2)).be.true;
expect(testStringmap.checkString(testString2)).toBeTrue();
// tslint:disable-next-line:no-unused-expression
expect(testStringmap.checkString(testString3)).be.true;
expect(testStringmap.checkString(testString3)).toBeTrue();
// tslint:disable-next-line:no-unused-expression
expect(testStringmap.checkMinimatch('*String1')).be.true;
expect(testStringmap.checkMinimatch('*String1')).toBeTrue();
// tslint:disable-next-line:no-unused-expression
expect(testStringmap.checkMinimatch('*String2')).be.true;
expect(testStringmap.checkMinimatch('*String2')).toBeTrue();
// tslint:disable-next-line:no-unused-expression
expect(testStringmap.checkMinimatch('*String4')).be.false;
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')).be.true;
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)).be.false;
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').be.true;
expect(clonedArray[0] === 'testString1').toBeTrue();
// tslint:disable-next-line:no-unused-expression
expect(clonedArray[0] === testString1).be.true;
expect(clonedArray[0] === testString1).toBeTrue();
});
tap.test(
@ -85,4 +83,4 @@ tap.test('lik.Stringmap.empty() -> should remove wipe and then notify', async ()
testStringmap.wipe();
});
tap.start();
export default tap.start();

View File

@ -1,19 +1,17 @@
// import test framework
import { expect, tap } from '@pushrocks/tapbundle';
import * as events from 'events';
import * as smartpromise from '@pushrocks/smartpromise';
import { expect, tap } from '@push.rocks/tapbundle';
// import the module
import * as lik from '../ts/index';
import * as lik from '../ts/index.js';
let testTimedAggregator: lik.TimedAggregtor<string>;
tap.test('should create a timed aggregaotor', async tools => {
tap.test('should create a timed aggregaotor', async (tools) => {
testTimedAggregator = new lik.TimedAggregtor<string>({
aggregationIntervalInMillis: 1000,
functionForAggregation: aggregation => {
functionForAggregation: (aggregation) => {
console.log(aggregation);
}
},
});
testTimedAggregator.add('This');
testTimedAggregator.add('is a whole sentence.');
@ -22,4 +20,4 @@ tap.test('should create a timed aggregaotor', async tools => {
await tools.delayFor(2000);
});
tap.start();
export default tap.start();

View File

@ -1,5 +1,5 @@
import { tap, expect } from '@pushrocks/tapbundle';
import * as lik from '../ts/index';
import { tap, expect } from '@push.rocks/tapbundle';
import * as lik from '../ts/index.js';
class TestClass {
constructor(public hey: string) {
@ -18,13 +18,13 @@ let testInstance6 = new TestClass('sixth');
tap.test('create a valid tree instance', async () => {
testTree = new lik.Tree();
expect(testTree).to.be.instanceOf(lik.Tree);
expect(testTree).toBeInstanceOf(lik.Tree);
});
tap.test('should insert an object', async () => {
testTree.initialize(testInstance);
let resultArray = testTree.treeToArray(testInstance, {});
expect(resultArray).to.contain(testInstance);
expect(resultArray).toContain(testInstance);
});
tap.test('should add other objects in a hierachy', async () => {
@ -37,4 +37,4 @@ tap.test("should create a JSON object that reflects a tree's hierachy", async ()
const jsonTreet = testTree.toJsonWithHierachy(testInstance);
});
tap.start();
export default tap.start();

View File

@ -1 +0,0 @@
import './test.objectmap';

8
ts/00_commitinfo_data.ts Normal file
View 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.'
}

View 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);
}
}

View 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
View 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;
}
}
}
}

View File

@ -1,8 +1,15 @@
import * as plugins from './lik.plugins';
import * as plugins from './classes.plugins.js';
import { InterestMap, IInterestComparisonFunc } from './lik.interestmap';
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>;
@ -21,9 +28,8 @@ export class Interest<DTInterestId, DTInterestFullfillment> {
return this.comparisonFunc(this.originalInterest);
}
private interestDeferred: plugins.smartpromise.Deferred<
DTInterestFullfillment
> = new plugins.smartpromise.Deferred();
private interestDeferred: plugins.smartpromise.Deferred<DTInterestFullfillment> =
new plugins.smartpromise.Deferred();
public interestFullfilled = this.interestDeferred.promise;
/**
@ -41,14 +47,20 @@ export class Interest<DTInterestId, DTInterestFullfillment> {
constructor(
interestMapArg: InterestMap<DTInterestId, DTInterestFullfillment>,
interestArg: DTInterestId,
comparisonFuncArg: IInterestComparisonFunc<DTInterestId>
comparisonFuncArg: IInterestComparisonFunc<DTInterestId>,
optionsArg?: IInterestOptions<DTInterestFullfillment>
) {
this.interestMapRef = interestMapArg;
this.originalInterest = interestArg;
this.comparisonFunc = comparisonFuncArg;
this.interestMapRef = interestMapArg;
this.options = optionsArg;
this.destructionTimer.completed.then(() => {
this.destroy();
});
if (this.options?.markLostAfterDefault) {
plugins.smartdelay.delayFor(this.options.markLostAfterDefault).then(this.markLost);
}
}
// ===============================
@ -60,6 +72,9 @@ export class Interest<DTInterestId, DTInterestFullfillment> {
*/
public destroy() {
this.interestMapRef.removeInterest(this);
if (!this.isFullfilled && this.options.defaultFullfillment) {
this.fullfillInterest(this.options.defaultFullfillment);
}
}
/**

View File

@ -1,43 +1,65 @@
import * as plugins from './lik.plugins';
import { Objectmap } from './lik.objectmap';
/* ===========
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
import { Observable } from 'rxjs';
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 { Interest } from './lik.interestmap.interest';
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>>();
private interestObjectMap = new ObjectMap<Interest<DTInterestId, DTInterestFullfillment>>();
/**
* a function to compare interests
*/
private comparisonFunc: IInterestComparisonFunc<DTInterestId>;
constructor(comparisonFuncArg: IInterestComparisonFunc<DTInterestId>) {
constructor(
comparisonFuncArg: IInterestComparisonFunc<DTInterestId>,
optionsArg: IInterestMapOptions = {}
) {
this.comparisonFunc = comparisonFuncArg;
this.options = optionsArg;
}
/**
* adds an interest to the InterestMap
* @param objectArg
* @param interestId
*/
public async addInterest(
objectArg: DTInterestId
interestId: DTInterestId,
defaultFullfillmentArg?: DTInterestFullfillment
): Promise<Interest<DTInterestId, DTInterestFullfillment>> {
const comparisonString = this.comparisonFunc(objectArg);
const comparisonString = this.comparisonFunc(interestId);
let returnInterest: Interest<DTInterestId, DTInterestFullfillment>;
const newInterest = new Interest<DTInterestId, DTInterestFullfillment>(
this,
objectArg,
this.comparisonFunc
interestId,
this.comparisonFunc,
{
markLostAfterDefault: this.options.markLostAfterDefault,
defaultFullfillment: defaultFullfillmentArg,
}
);
let interestExists = false;
await this.interestObjectMap.forEach(interestArg => {
await this.interestObjectMap.forEach((interestArg) => {
if (!interestExists && interestArg.comparisonString === newInterest.comparisonString) {
console.log('info', `interest already exists for ${newInterest.comparisonString}`);
interestExists = true;
@ -53,15 +75,13 @@ export class InterestMap<DTInterestId, DTInterestFullfillment> {
return returnInterest;
}
// tslint:disable-next-line:member-ordering
public interestObservable = new plugins.smartrx.ObservableIntake<Interest<DTInterestId, any>>();
/**
* removes an interest from the interest map
* @param objectArg removes an interest from the InterestMap
*/
public removeInterest(interestArg: Interest<DTInterestId, DTInterestFullfillment>) {
const interestToRemove = this.interestObjectMap.findOneAndRemove(interestArg2 => {
const interestToRemove = this.interestObjectMap.findOneAndRemoveSync((interestArg2) => {
return interestArg.comparisonString === interestArg2.comparisonString;
});
}
@ -79,7 +99,7 @@ export class InterestMap<DTInterestId, DTInterestFullfillment> {
* @param comparisonStringArg
*/
public checkInterestByString(comparisonStringArg: string): boolean {
const foundInterest = this.interestObjectMap.find(interest => {
const foundInterest = this.interestObjectMap.findSync((interest) => {
return interest.comparisonString === comparisonStringArg;
});
if (foundInterest) {
@ -102,12 +122,12 @@ export class InterestMap<DTInterestId, DTInterestFullfillment> {
/**
* finds an interest
* @param objectArg
* @param interestId
*/
public findInterest(objectArg: DTInterestId): Interest<DTInterestId, DTInterestFullfillment> {
const comparableString = this.comparisonFunc(objectArg);
const interest = this.interestObjectMap.find(interest => {
return interest.comparisonString === comparableString;
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
}

View File

@ -1,4 +1,4 @@
import * as plugins from './lik.plugins';
import * as plugins from './classes.plugins.js';
export class LimitedArray<T> {
array: T[] = [];

23
ts/classes.looptracker.ts Normal file
View 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
View 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
View 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 };

View File

@ -1,16 +1,14 @@
import * as plugins from './lik.plugins';
import * as plugins from './classes.plugins.js';
/**
* allows you to easily keep track of a bunch of strings
*/
export interface ITriggerFunction {
(): boolean;
}
export type TTriggerFunction = (stringArray?: string[]) => boolean;
export class Stringmap {
private _stringArray: string[] = [];
private _triggerUntilTrueFunctionArray: ITriggerFunction[] = [];
private _triggerUntilTrueFunctionArray: TTriggerFunction[] = [];
constructor() {}
/**
* add a string to the Stringmap
@ -24,7 +22,7 @@ export class Stringmap {
* like addString, but accepts an array of strings
*/
addStringArray(stringArrayArg: string[]) {
for (let stringItem of stringArrayArg) {
for (const stringItem of stringArrayArg) {
this.addString(stringItem);
}
}
@ -33,7 +31,7 @@ export class Stringmap {
* removes a string from Stringmap
*/
removeString(stringArg: string) {
for (let keyArg in this._stringArray) {
for (const keyArg in this._stringArray) {
if (this._stringArray[keyArg] === stringArg) {
this._stringArray.splice(parseInt(keyArg), 1);
}
@ -60,9 +58,10 @@ export class Stringmap {
* checks stringPresence with minimatch
*/
public checkMinimatch(miniMatchStringArg: string): boolean {
const smartMatchInstance = new plugins.smartmatch.SmartMatch(miniMatchStringArg);
let foundMatch: boolean = false;
for (let stringItem of this._stringArray) {
if (plugins.minimatch(stringItem, miniMatchStringArg)) {
for (const stringItem of this._stringArray) {
if (smartMatchInstance.match(stringItem)) {
foundMatch = true;
}
}
@ -92,22 +91,27 @@ export class Stringmap {
/**
* register a new trigger
*/
public registerUntilTrue(functionArg: ITriggerFunction, doFunctionArg) {
public registerUntilTrue(functionArg: TTriggerFunction, callbackArg?: () => any) {
const trueDeferred = plugins.smartpromise.defer();
this._triggerUntilTrueFunctionArray.push(() => {
let result = functionArg();
const result = functionArg(this.getStringArray());
if (result === true) {
doFunctionArg();
if (callbackArg) {
callbackArg();
}
trueDeferred.resolve();
}
return result;
});
this.notifyTrigger();
return trueDeferred.promise;
}
/**
* notifies triggers
*/
private notifyTrigger() {
let filteredArray = this._triggerUntilTrueFunctionArray.filter(functionArg => {
const filteredArray = this._triggerUntilTrueFunctionArray.filter((functionArg) => {
return !functionArg();
});
this._triggerUntilTrueFunctionArray = filteredArray;

View File

@ -1,4 +1,4 @@
import * as plugins from './lik.plugins';
import * as plugins from './classes.plugins.js';
export interface ITimedAggregatorOptions<T> {
aggregationIntervalInMillis: number;

View File

@ -1,4 +1,4 @@
import * as plugins from './lik.plugins';
import * as plugins from './classes.plugins.js';
export class Tree<T> {
symbolTree: any;
@ -62,15 +62,15 @@ export class Tree<T> {
return this.symbolTree.ancestorsToArray(objectArg, optionsArg);
}
treeToArray(rootArg, optionsArg: any): T[] {
treeToArray(rootArg: T, optionsArg: any): T[] {
return this.symbolTree.treeToArray(rootArg, optionsArg);
}
childrenIterator(parentArg: T, optionsArg): T {
childrenIterator(parentArg: T, optionsArg: any): T {
return this.symbolTree.childrenIterator(parentArg, optionsArg);
}
previousSiblingsIterator(objectArg): T {
previousSiblingsIterator(objectArg: T): T {
return this.symbolTree.previousSiblingsIterator(objectArg);
}
@ -78,11 +78,11 @@ export class Tree<T> {
return this.symbolTree.nextSiblingsIterator();
}
ancestorsIterator(objectArg) {
ancestorsIterator(objectArg: T) {
this.symbolTree.ancestorsIterator();
}
treeIterator(rootArg: T, optionsArg): Iterable<T> {
treeIterator(rootArg: T, optionsArg: any): Iterable<T> {
return this.symbolTree.treeIterator(rootArg);
}
@ -114,7 +114,7 @@ export class Tree<T> {
return this.symbolTree.prependChild(referenceObjectArg, newObjectArg);
}
appendChild(referenceObjectArg, newObjectArg) {
appendChild(referenceObjectArg: T, newObjectArg: T) {
return this.symbolTree.appendChild(referenceObjectArg, newObjectArg);
}
@ -126,7 +126,7 @@ export class Tree<T> {
* returns a branch of the tree as JSON
* can be user
*/
toJsonWithHierachy(rootElement) {
toJsonWithHierachy(rootElement: T) {
const treeIterable = this.treeIterator(rootElement, {});
for (const treeItem of treeIterable) {
console.log(treeItem);
@ -137,5 +137,5 @@ export class Tree<T> {
* builds a tree from a JSON with hierachy
* @param rootElement
*/
fromJsonWithHierachy(rootElement) {}
fromJsonWithHierachy(rootElement: T) {}
}

View File

@ -1,11 +1,11 @@
import * as plugins from './lik.plugins';
// import modules
export * from './lik.interestmap';
export * from './lik.limitedarray';
export * from './lik.looptracker';
export * from './lik.objectmap';
export * from './lik.stringmap';
export * from './lik.timedaggregator';
export * from './lik.tree';
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';

View File

@ -1,18 +0,0 @@
import * as plugins from './lik.plugins';
import { Objectmap } from './lik.objectmap';
export class LoopTracker<T> {
referenceObjectMap = new Objectmap<any>();
constructor() {
// nothing here
}
/**
* checks and tracks an object
* @param objectArg
*/
checkAndTrack(objectArg: T) {
return this.referenceObjectMap.add(objectArg);
}
}

View File

@ -1,136 +0,0 @@
import * as plugins from './lik.plugins';
export interface IObjectmapForEachFunction<T> {
(itemArg: T): void;
}
export interface IObjectmapFindFunction<T> {
(itemArg: T): boolean;
}
/**
* allows keeping track of objects
*/
export class Objectmap<T> {
private objectArray: T[] = [];
/**
* returns a new instance
*/
constructor() {
// nothing here
}
/**
* 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): boolean {
if (this.checkForObject(objectArg)) {
// the object is already in the objectmap
return false;
} else {
// the object is not yet in the objectmap
this.objectArray.push(objectArg);
return true;
}
}
/**
* like .add but adds an whole array of objects
*/
public addArray(objectArrayArg: T[]) {
for (let item of objectArrayArg) {
this.add(item);
}
}
/**
* check if object is in Objectmap
*/
public checkForObject(objectArg: T) {
return this.objectArray.indexOf(objectArg) !== -1;
}
/**
* find object
*/
public find(findFunction: IObjectmapFindFunction<T>) {
const resultArray = this.objectArray.filter(findFunction);
if (resultArray.length > 0) {
return resultArray[0];
} else {
return null;
}
}
/**
* finds a specific element and then removes it
*/
public findOneAndRemove(findFunction: IObjectmapFindFunction<T>): T {
const foundElement = this.find(findFunction);
if (foundElement) {
this.remove(foundElement);
}
return foundElement;
}
/**
* run function for each item in Objectmap
*/
public async forEach(functionArg: IObjectmapForEachFunction<T>) {
for (let object of this.objectArray) {
await functionArg(object);
}
}
/**
* gets an object in the Observablemap and removes it, so it can't be retrieved again
*/
public getOneAndRemove(): T {
return this.objectArray.shift();
}
/**
* returns a cloned array of all the objects currently in the Objectmap
*/
public getArray(): T[] {
const returnArray: any[] = [];
for (const objectItem of this.objectArray) {
returnArray.push(objectItem);
}
return returnArray;
}
/**
* check if Objectmap ist empty
*/
public isEmpty(): boolean {
if (this.objectArray.length === 0) {
return true;
} else {
return false;
}
}
/**
* remove object from Objectmap
*/
public remove(objectArg: T) {
let replacementArray = [];
for (let item of this.objectArray) {
if (item !== objectArg) {
replacementArray.push(item);
}
}
this.objectArray = replacementArray;
}
/**
* wipe Objectmap
*/
public wipe() {
this.objectArray = [];
}
}

View File

@ -1,25 +0,0 @@
// ==============
// native
// ==============
import * as events from 'events';
export { events };
// ==============
// @pushrocks
// ==============
import * as smartdelay from '@pushrocks/smartdelay';
import * as smartpromise from '@pushrocks/smartpromise';
import * as smartrx from '@pushrocks/smartrx';
import * as smarttime from '@pushrocks/smarttime';
export { smartdelay, smartpromise, smartrx, smarttime };
// ==============
// third party
// ==============
import minimatch from 'minimatch';
const symbolTree = require('symbol-tree');
export { minimatch, symbolTree };

14
tsconfig.json Normal file
View File

@ -0,0 +1,14 @@
{
"compilerOptions": {
"experimentalDecorators": true,
"useDefineForClassFields": false,
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"esModuleInterop": true,
"verbatimModuleSyntax": true
},
"exclude": [
"dist_*/**/*.d.ts"
]
}

View File

@ -1,17 +0,0 @@
{
"extends": ["tslint:latest", "tslint-config-prettier"],
"rules": {
"semicolon": [true, "always"],
"no-console": false,
"ordered-imports": false,
"object-literal-sort-keys": false,
"member-ordering": {
"options":{
"order": [
"static-method"
]
}
}
},
"defaultSeverity": "warning"
}