Compare commits

..

76 Commits

Author SHA1 Message Date
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
aae10344fe 3.0.10 2019-08-02 16:57:45 +02:00
52b65d7dc3 3.0.9 2019-08-02 16:48:30 +02:00
1135b418cb 3.0.8 2019-08-02 16:38:09 +02:00
2eb1dbd0b3 fix(core): update 2019-08-02 16:38:08 +02:00
8ec54c17a1 3.0.7 2019-08-02 16:33:46 +02:00
500a291b2a fix(core): update 2019-08-02 16:33:45 +02:00
256a14fcb0 3.0.6 2019-08-02 16:32:52 +02:00
7aa0f05bae fix(core): update 2019-08-02 16:32:52 +02:00
6208cab36a 3.0.5 2019-03-15 23:50:40 +01:00
50a9697baf fix(objectmap): getArray() now has correct return type 2019-03-15 23:50:39 +01:00
7956cf6ace 3.0.4 2018-12-11 01:41:05 +01:00
d8956d4e32 fix(ci): remove old build dependencies 2018-12-11 01:41:05 +01:00
c93a67c351 3.0.3 2018-12-11 01:36:15 +01:00
fafd9867ad fix(core): update 2018-12-11 01:36:14 +01:00
26 changed files with 11384 additions and 897 deletions

23
.gitignore vendored
View File

@ -1,5 +1,20 @@
node_modules/
pages/
public/
coverage/
.nogit/ .nogit/
# artifacts
coverage/
public/
pages/
# installs
node_modules/
# caches
.yarn/
.cache/
.rpt2_cache
# builds
dist/
dist_*/
# custom

View File

@ -1,16 +1,16 @@
# gitzone standard # gitzone ci_default
image: hosttoday/ht-docker-node:npmci image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
cache: cache:
paths: paths:
- .npmci_cache/ - .npmci_cache/
key: "$CI_BUILD_STAGE" key: '$CI_BUILD_STAGE'
stages: stages:
- security - security
- test - test
- release - release
- metadata - metadata
# ==================== # ====================
# security stage # security stage
@ -19,50 +19,41 @@ mirror:
stage: security stage: security
script: script:
- npmci git mirror - npmci git mirror
only:
- tags
tags: tags:
- lossless
- docker - docker
- notpriv - notpriv
snyk: auditProductionDependencies:
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
stage: security stage: security
script: script:
- npmci npm prepare - npmci npm prepare
- npmci command npm install -g snyk - npmci command npm install --production --ignore-scripts
- npmci command npm install --ignore-scripts - npmci command npm config set registry https://registry.npmjs.org
- npmci command snyk test - npmci command npm audit --audit-level=high --only=prod --production
tags: tags:
- docker - docker
- notpriv
auditDevDependencies:
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
stage: security
script:
- npmci npm prepare
- npmci command npm install --ignore-scripts
- npmci command npm config set registry https://registry.npmjs.org
- npmci command npm audit --audit-level=high --only=dev
tags:
- docker
allow_failure: true
# ==================== # ====================
# test stage # test stage
# ==================== # ====================
testLEGACY:
stage: test
script:
- npmci npm prepare
- npmci node install legacy
- npmci npm install
- npmci npm test
coverage: /\d+.?\d+?\%\s*coverage/
tags:
- docker
- notpriv
allow_failure: true
testLTS: testStable:
stage: test
script:
- npmci npm prepare
- npmci node install lts
- npmci npm install
- npmci npm test
coverage: /\d+.?\d+?\%\s*coverage/
tags:
- docker
- notpriv
testSTABLE:
stage: test stage: test
script: script:
- npmci npm prepare - npmci npm prepare
@ -72,7 +63,17 @@ testSTABLE:
coverage: /\d+.?\d+?\%\s*coverage/ coverage: /\d+.?\d+?\%\s*coverage/
tags: tags:
- docker - docker
- notpriv
testBuild:
stage: test
script:
- npmci npm prepare
- npmci node install stable
- npmci npm install
- npmci command npm run build
coverage: /\d+.?\d+?\%\s*coverage/
tags:
- docker
release: release:
stage: release stage: release
@ -82,6 +83,7 @@ release:
only: only:
- tags - tags
tags: tags:
- lossless
- docker - docker
- notpriv - notpriv
@ -90,20 +92,16 @@ release:
# ==================== # ====================
codequality: codequality:
stage: metadata stage: metadata
image: docker:stable
allow_failure: true allow_failure: true
services: only:
- docker:stable-dind - tags
script: script:
- export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/') - npmci command npm install -g tslint typescript
- docker run - npmci npm prepare
--env SOURCE_CODE="$PWD" - npmci npm install
--volume "$PWD":/code - npmci command "tslint -c tslint.json ./ts/**/*.ts"
--volume /var/run/docker.sock:/var/run/docker.sock
"registry.gitlab.com/gitlab-org/security-products/codequality:$SP_VERSION" /code
artifacts:
paths: [codeclimate.json]
tags: tags:
- lossless
- docker - docker
- priv - priv
@ -114,18 +112,20 @@ trigger:
only: only:
- tags - tags
tags: tags:
- lossless
- docker - docker
- notpriv - notpriv
pages: pages:
image: hosttoday/ht-docker-node:npmci
stage: metadata stage: metadata
script: script:
- npmci command npm install -g typedoc typescript - npmci node install lts
- npmci command npm install -g @gitzone/tsdoc
- npmci npm prepare - npmci npm prepare
- npmci npm install - npmci npm install
- npmci command typedoc --module "commonjs" --target "ES2016" --out public/ ts/ - npmci command tsdoc
tags: tags:
- lossless
- docker - docker
- notpriv - notpriv
only: only:

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

@ -0,0 +1,29 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "current file",
"type": "node",
"request": "launch",
"args": [
"${relativeFile}"
],
"runtimeArgs": ["-r", "@gitzone/tsrun"],
"cwd": "${workspaceRoot}",
"protocol": "inspector",
"internalConsoleOptions": "openOnSessionStart"
},
{
"name": "test.ts",
"type": "node",
"request": "launch",
"args": [
"test/test.ts"
],
"runtimeArgs": ["-r", "@gitzone/tsrun"],
"cwd": "${workspaceRoot}",
"protocol": "inspector",
"internalConsoleOptions": "openOnSessionStart"
}
]
}

26
.vscode/settings.json vendored Normal file
View 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"]
}
}
}
}
}
}
]
}

View File

@ -1,47 +0,0 @@
# lik
light little helpers for node
## Availabililty
[![npm](https://pushrocks.gitlab.io/assets/repo-button-npm.svg)](https://www.npmjs.com/package/lik)
[![git](https://pushrocks.gitlab.io/assets/repo-button-git.svg)](https://GitLab.com/pushrocks/lik)
[![git](https://pushrocks.gitlab.io/assets/repo-button-mirror.svg)](https://github.com/pushrocks/lik)
[![docs](https://pushrocks.gitlab.io/assets/repo-button-docs.svg)](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/lik.svg)](https://www.npmjs.com/package/lik)
[![Dependency Status](https://david-dm.org/pushrocks/lik.svg)](https://david-dm.org/pushrocks/lik)
[![bitHound Dependencies](https://www.bithound.io/github/pushrocks/lik/badges/dependencies.svg)](https://www.bithound.io/github/pushrocks/lik/master/dependencies/npm)
[![bitHound Code](https://www.bithound.io/github/pushrocks/lik/badges/code.svg)](https://www.bithound.io/github/pushrocks/lik)
[![Known Vulnerabilities](https://snyk.io/test/npm/lik/badge.svg)](https://snyk.io/test/npm/lik)
[![TypeScript](https://img.shields.io/badge/TypeScript-2.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/)
[![node](https://img.shields.io/badge/node->=%206.x.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/)
[![JavaScript Style Guide](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](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)
[![repo-footer](https://pushrocks.gitlab.io/assets/repo-footer.svg)](https://push.rocks)

View File

@ -1,14 +1,17 @@
{ {
"npmci": { "npmci": {
"npmGlobalTools": [ "npmGlobalTools": [],
"@gitzone/npmts"
],
"npmAccessLevel": "public" "npmAccessLevel": "public"
}, },
"npmts": { "gitzone": {
"coverageTreshold": 40, "projectType": "npm",
"testConfig": { "module": {
"parallel": false "githost": "gitlab.com",
"gitscope": "pushrocks",
"gitrepo": "lik",
"shortDescription": "light little helpers for node",
"npmPackagename": "@pushrocks/lik",
"license": "MIT"
} }
} }
} }

11906
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,13 +1,13 @@
{ {
"name": "@pushrocks/lik", "name": "@pushrocks/lik",
"version": "3.0.2", "version": "4.0.21",
"private": false, "private": false,
"description": "light little helpers for node", "description": "light little helpers for node",
"main": "dist/index.js", "main": "dist_ts/index.js",
"typings": "dist/index.d.ts", "typings": "dist_ts/index.d.ts",
"scripts": { "scripts": {
"test": "(tstest test/)", "test": "(tstest test/)",
"build": "(tsbuild)" "build": "(tsbuild --web && tsbundle npm)"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@ -20,21 +20,37 @@
}, },
"homepage": "https://gitlab.com/pushrocks/lik#README", "homepage": "https://gitlab.com/pushrocks/lik#README",
"devDependencies": { "devDependencies": {
"@gitzone/tsbuild": "^2.0.22", "@gitzone/tsbuild": "^2.1.25",
"@gitzone/tsrun": "^1.1.13", "@gitzone/tsbundle": "^1.0.78",
"@gitzone/tstest": "^1.0.15", "@gitzone/tsrun": "^1.2.12",
"@pushrocks/tapbundle": "^3.0.7", "@gitzone/tstest": "^1.0.52",
"@types/node": "^10.12.10", "@pushrocks/tapbundle": "^3.2.9",
"tslint": "^5.11.0", "@types/node": "^14.14.9",
"tslint-config-prettier": "^1.16.0" "tslint": "^6.1.3",
"tslint-config-prettier": "^1.18.0"
}, },
"dependencies": { "dependencies": {
"@pushrocks/smartdelay": "^2.0.2", "@pushrocks/smartdelay": "^2.0.10",
"@pushrocks/smartpromise": "^2.0.5", "@pushrocks/smartmatch": "^1.0.7",
"@pushrocks/smartrx": "^2.0.2", "@pushrocks/smartpromise": "^3.1.3",
"@pushrocks/smarttime": "^3.0.5", "@pushrocks/smartrx": "^2.0.19",
"@pushrocks/smarttime": "^3.0.37",
"@types/minimatch": "^3.0.3", "@types/minimatch": "^3.0.3",
"minimatch": "^3.0.4", "symbol-tree": "^3.2.4"
"symbol-tree": "^3.2.2" },
} "files": [
"ts/**/*",
"ts_web/**/*",
"dist/**/*",
"dist_*/**/*",
"dist_ts/**/*",
"dist_ts_web/**/*",
"assets/**/*",
"cli.js",
"npmextra.json",
"readme.md"
],
"browserslist": [
"last 1 chrome versions"
]
} }

54
readme.md Normal file
View File

@ -0,0 +1,54 @@
# @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
Status Category | Status Badge
-- | --
GitLab Pipelines | [![pipeline status](https://gitlab.com/pushrocks/lik/badges/master/pipeline.svg)](https://lossless.cloud)
GitLab Pipline Test Coverage | [![coverage report](https://gitlab.com/pushrocks/lik/badges/master/coverage.svg)](https://lossless.cloud)
npm | [![npm downloads per month](https://badgen.net/npm/dy/@pushrocks/lik)](https://lossless.cloud)
Snyk | [![Known Vulnerabilities](https://badgen.net/snyk/pushrocks/lik)](https://lossless.cloud)
TypeScript Support | [![TypeScript](https://badgen.net/badge/TypeScript/>=%203.x/blue?icon=typescript)](https://lossless.cloud)
node Support | [![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
Code Style | [![Code Style](https://badgen.net/badge/style/prettier/purple)](https://lossless.cloud)
PackagePhobia (total standalone install weight) | [![PackagePhobia](https://badgen.net/packagephobia/install/@pushrocks/lik)](https://lossless.cloud)
PackagePhobia (package size on registry) | [![PackagePhobia](https://badgen.net/packagephobia/publish/@pushrocks/lik)](https://lossless.cloud)
BundlePhobia (total size when bundled) | [![BundlePhobia](https://badgen.net/bundlephobia/minzip/@pushrocks/lik)](https://lossless.cloud)
Platform support | [![Supports Windows 10](https://badgen.net/badge/supports%20Windows%2010/yes/green?icon=windows)](https://lossless.cloud) [![Supports Mac OS X](https://badgen.net/badge/supports%20Mac%20OS%20X/yes/green?icon=apple)](https://lossless.cloud)
## 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.
## Contribution
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
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)
[![repo-footer](https://lossless.gitlab.io/publicrelations/repofooter.svg)](https://maintainedby.lossless.com)

View File

@ -11,19 +11,19 @@ interface ITestObject {
propOne: string; propOne: string;
propTwo: string; propTwo: string;
} }
let testObjectmap: lik.Objectmap<ITestObject>; let testObjectmap: lik.ObjectMap<ITestObject>;
let testObject1: ITestObject = { let testObject1: ITestObject = {
propOne: 'hello', propOne: 'hello',
propTwo: 'hello2' propTwo: 'hello2',
}; };
let testObject2: ITestObject = { let testObject2: ITestObject = {
propOne: 'hello', propOne: 'hello',
propTwo: 'hello2' propTwo: 'hello2',
}; };
tap.test('new lik.Objectmap() -> should correctly instantiate an Objectmap', async () => { tap.test('new lik.Objectmap() -> should correctly instantiate an Objectmap', async () => {
testObjectmap = new lik.Objectmap<ITestObject>(); testObjectmap = new lik.ObjectMap<ITestObject>();
expect(testObjectmap).be.instanceof(lik.Objectmap); expect(testObjectmap).be.instanceof(lik.ObjectMap);
}); });
tap.test('lik.Objectmap.add() -> should correctly add an object to Objectmap', async () => { tap.test('lik.Objectmap.add() -> should correctly add an object to Objectmap', async () => {
@ -44,7 +44,7 @@ tap.test('lik.Objectmap.remove() -> should correctly remove an object to Objectm
}); });
tap.test('Objectmap.forEach -> should correctly run a function forEach map object', async () => { tap.test('Objectmap.forEach -> should correctly run a function forEach map object', async () => {
testObjectmap.forEach(itemArg => { testObjectmap.forEach((itemArg) => {
expect(itemArg).to.have.property('propOne'); expect(itemArg).to.have.property('propOne');
}); });
}); });
@ -52,7 +52,7 @@ tap.test('Objectmap.forEach -> should correctly run a function forEach map objec
tap.test('lik.Objectmap.find() -> should correctly find an object', async () => { tap.test('lik.Objectmap.find() -> should correctly find an object', async () => {
let myObject = { propOne: 'helloThere', propTwo: 'helloAnyway' }; let myObject = { propOne: 'helloThere', propTwo: 'helloAnyway' };
testObjectmap.add(myObject); testObjectmap.add(myObject);
let referenceObject = testObjectmap.find(itemArg => { let referenceObject = testObjectmap.find((itemArg) => {
return itemArg.propOne === 'helloThere'; return itemArg.propOne === 'helloThere';
}); });
// tslint:disable-next-line:no-unused-expression // tslint:disable-next-line:no-unused-expression

View File

@ -0,0 +1,25 @@
// 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 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);
});
tap.start();

View File

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

View File

@ -1,10 +1,9 @@
import * as plugins from './lik.plugins'; export * from './lik.fastmap';
// import modules
export * from './lik.interestmap'; export * from './lik.interestmap';
export * from './lik.interestmap.interest';
export * from './lik.limitedarray'; export * from './lik.limitedarray';
export * from './lik.looptracker'; export * from './lik.looptracker';
export * from './lik.objectmap'; export * from './lik.objectmap';
export * from './lik.stringmap'; export * from './lik.stringmap';
export * from './lik.timedaggregator';
export * from './lik.tree'; export * from './lik.tree';

88
ts/lik.fastmap.ts Normal file
View File

@ -0,0 +1,88 @@
import * as plugins from './lik.plugins';
/**
* 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(findFunction: (mapItemArg: T) => Promise<boolean>) {
for (const key of this.getKeys()) {
}
}
}

View File

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

View File

@ -1,5 +1,5 @@
import * as plugins from './lik.plugins'; import * as plugins from './lik.plugins';
import { Objectmap } from './lik.objectmap'; import { ObjectMap } from './lik.objectmap';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
@ -7,21 +7,29 @@ import { Interest } from './lik.interestmap.interest';
export type IInterestComparisonFunc<T> = (objectArg: T) => string; export type IInterestComparisonFunc<T> = (objectArg: T) => string;
export interface IInterestMapOptions {
markLostAfterDefault?: number;
}
export class InterestMap<DTInterestId, DTInterestFullfillment> { export class InterestMap<DTInterestId, DTInterestFullfillment> {
public options: IInterestMapOptions;
/** /**
* stores interests that are currently fullfilled by the cache * 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 * a function to compare interests
*/ */
private comparisonFunc: IInterestComparisonFunc<DTInterestId>; private comparisonFunc: IInterestComparisonFunc<DTInterestId>;
constructor(comparisonFuncArg: IInterestComparisonFunc<DTInterestId>) { constructor(
comparisonFuncArg: IInterestComparisonFunc<DTInterestId>,
optionsArg: IInterestMapOptions = {}
) {
this.comparisonFunc = comparisonFuncArg; this.comparisonFunc = comparisonFuncArg;
this.options = optionsArg;
} }
/** /**
@ -29,17 +37,22 @@ export class InterestMap<DTInterestId, DTInterestFullfillment> {
* @param objectArg * @param objectArg
*/ */
public async addInterest( public async addInterest(
objectArg: DTInterestId objectArg: DTInterestId,
defaultFullfillmentArg?: DTInterestFullfillment
): Promise<Interest<DTInterestId, DTInterestFullfillment>> { ): Promise<Interest<DTInterestId, DTInterestFullfillment>> {
const comparisonString = this.comparisonFunc(objectArg); const comparisonString = this.comparisonFunc(objectArg);
let returnInterest: Interest<DTInterestId, DTInterestFullfillment>; let returnInterest: Interest<DTInterestId, DTInterestFullfillment>;
const newInterest = new Interest<DTInterestId, DTInterestFullfillment>( const newInterest = new Interest<DTInterestId, DTInterestFullfillment>(
this, this,
objectArg, objectArg,
this.comparisonFunc this.comparisonFunc,
{
markLostAfterDefault: this.options.markLostAfterDefault,
defaultFullfillment: defaultFullfillmentArg,
}
); );
let interestExists = false; let interestExists = false;
await this.interestObjectMap.forEach(interestArg => { await this.interestObjectMap.forEach((interestArg) => {
if (!interestExists && interestArg.comparisonString === newInterest.comparisonString) { if (!interestExists && interestArg.comparisonString === newInterest.comparisonString) {
console.log('info', `interest already exists for ${newInterest.comparisonString}`); console.log('info', `interest already exists for ${newInterest.comparisonString}`);
interestExists = true; interestExists = true;
@ -63,7 +76,7 @@ export class InterestMap<DTInterestId, DTInterestFullfillment> {
* @param objectArg removes an interest from the InterestMap * @param objectArg removes an interest from the InterestMap
*/ */
public removeInterest(interestArg: Interest<DTInterestId, DTInterestFullfillment>) { public removeInterest(interestArg: Interest<DTInterestId, DTInterestFullfillment>) {
const interestToRemove = this.interestObjectMap.findOneAndRemove(interestArg2 => { const interestToRemove = this.interestObjectMap.findOneAndRemove((interestArg2) => {
return interestArg.comparisonString === interestArg2.comparisonString; return interestArg.comparisonString === interestArg2.comparisonString;
}); });
} }
@ -81,7 +94,7 @@ export class InterestMap<DTInterestId, DTInterestFullfillment> {
* @param comparisonStringArg * @param comparisonStringArg
*/ */
public checkInterestByString(comparisonStringArg: string): boolean { public checkInterestByString(comparisonStringArg: string): boolean {
const foundInterest = this.interestObjectMap.find(interest => { const foundInterest = this.interestObjectMap.find((interest) => {
return interest.comparisonString === comparisonStringArg; return interest.comparisonString === comparisonStringArg;
}); });
if (foundInterest) { if (foundInterest) {
@ -95,12 +108,11 @@ export class InterestMap<DTInterestId, DTInterestFullfillment> {
* inform lost interest * inform lost interest
* @param interestId * @param interestId
*/ */
public informLostInterest (interestId: DTInterestId) { public informLostInterest(interestId: DTInterestId) {
const wantedInterest = this.findInterest(interestId); const wantedInterest = this.findInterest(interestId);
if (wantedInterest) { if (wantedInterest) {
wantedInterest.markLost(); wantedInterest.markLost();
} }
} }
/** /**
@ -109,8 +121,8 @@ export class InterestMap<DTInterestId, DTInterestFullfillment> {
*/ */
public findInterest(objectArg: DTInterestId): Interest<DTInterestId, DTInterestFullfillment> { public findInterest(objectArg: DTInterestId): Interest<DTInterestId, DTInterestFullfillment> {
const comparableString = this.comparisonFunc(objectArg); const comparableString = this.comparisonFunc(objectArg);
const interest = this.interestObjectMap.find(interest => { const interest = this.interestObjectMap.find((interestArg) => {
return interest.comparisonString === comparableString; return interestArg.comparisonString === comparableString;
}); });
return interest; // if an interest is found, the interest is returned, otherwise interest is null return interest; // if an interest is found, the interest is returned, otherwise interest is null
} }

View File

@ -1,9 +1,9 @@
import * as plugins from './lik.plugins'; import * as plugins from './lik.plugins';
import { Objectmap } from './lik.objectmap'; import { ObjectMap } from './lik.objectmap';
export class LoopTracker<T> { export class LoopTracker<T> {
referenceObjectMap = new Objectmap<any>(); referenceObjectMap = new ObjectMap<any>();
constructor() { constructor() {
// nothing here // nothing here
} }
@ -12,7 +12,12 @@ export class LoopTracker<T> {
* checks and tracks an object * checks and tracks an object
* @param objectArg * @param objectArg
*/ */
checkAndTrack(objectArg: T) { checkAndTrack(objectArg: T): boolean {
return this.referenceObjectMap.add(objectArg); if (!this.referenceObjectMap.checkForObject(objectArg)) {
this.referenceObjectMap.add(objectArg);
return true;
} else {
return false;
}
} }
} }

View File

@ -1,4 +1,13 @@
import * as plugins from './lik.plugins'; import * as plugins from './lik.plugins';
import { FastMap } from './lik.fastmap';
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> { export interface IObjectmapForEachFunction<T> {
(itemArg: T): void; (itemArg: T): void;
@ -8,11 +17,19 @@ export interface IObjectmapFindFunction<T> {
(itemArg: T): boolean; (itemArg: T): boolean;
} }
export interface IObjectMapEventData<T> {
operation: 'add' | 'remove';
payload: T;
}
/** /**
* allows keeping track of objects * allows keeping track of objects
*/ */
export class Objectmap<T> { export class ObjectMap<T> {
private objectArray: T[] = []; private fastMap = new FastMap<T>();
// events
public eventSubject = new plugins.smartrx.rxjs.Subject<IObjectMapEventData<T>>();
/** /**
* returns a new instance * returns a new instance
@ -21,27 +38,59 @@ export class Objectmap<T> {
// nothing here // 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 * add object to Objectmap
* returns false if the object is already in the map * returns false if the object is already in the map
* returns true if the object was added successfully * returns true if the object was added successfully
*/ */
public add(objectArg: T): boolean { public add(objectArg: T): string {
if (this.checkForObject(objectArg)) { // lets search for an existing unique key
// the object is already in the objectmap for (const keyArg of this.fastMap.getKeys()) {
return false; const object = this.fastMap.getByKey(keyArg);
} else { if (object === objectArg) {
// the object is not yet in the objectmap return keyArg;
this.objectArray.push(objectArg);
return true;
} }
} }
// 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 * like .add but adds an whole array of objects
*/ */
public addArray(objectArrayArg: T[]) { public addArray(objectArrayArg: T[]) {
for (let item of objectArrayArg) { for (const item of objectArrayArg) {
this.add(item); this.add(item);
} }
} }
@ -49,19 +98,34 @@ export class Objectmap<T> {
/** /**
* check if object is in Objectmap * check if object is in Objectmap
*/ */
public checkForObject(objectArg: T) { public checkForObject(objectArg: T): boolean {
return this.objectArray.indexOf(objectArg) !== -1; 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 * find object
*/ */
public find(findFunction: IObjectmapFindFunction<T>) { public find(findFunction: IObjectmapFindFunction<T>): T {
const resultArray = this.objectArray.filter(findFunction); for (const keyArg of this.fastMap.getKeys()) {
if (resultArray.length > 0) { if (findFunction(this.fastMap.getByKey(keyArg))) {
return resultArray[0]; return this.getMappedUnique(keyArg);
} else { }
return null;
} }
} }
@ -80,8 +144,8 @@ export class Objectmap<T> {
* run function for each item in Objectmap * run function for each item in Objectmap
*/ */
public async forEach(functionArg: IObjectmapForEachFunction<T>) { public async forEach(functionArg: IObjectmapForEachFunction<T>) {
for (let object of this.objectArray) { for (const keyArg of this.fastMap.getKeys()) {
await functionArg(object); await functionArg(this.fastMap.getByKey(keyArg));
} }
} }
@ -89,16 +153,27 @@ export class Objectmap<T> {
* gets an object in the Observablemap and removes it, so it can't be retrieved again * gets an object in the Observablemap and removes it, so it can't be retrieved again
*/ */
public getOneAndRemove(): T { public getOneAndRemove(): T {
return this.objectArray.shift(); 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 * returns a cloned array of all the objects currently in the Objectmap
*/ */
public getArray() { public getArray(): T[] {
const returnArray: any[] = []; const returnArray: any[] = [];
for (const objectItem of this.objectArray) { for (const keyArg of this.fastMap.getKeys()) {
returnArray.push(objectItem); returnArray.push(this.fastMap.getByKey(keyArg));
} }
return returnArray; return returnArray;
} }
@ -107,30 +182,50 @@ export class Objectmap<T> {
* check if Objectmap ist empty * check if Objectmap ist empty
*/ */
public isEmpty(): boolean { public isEmpty(): boolean {
if (this.objectArray.length === 0) { return this.fastMap.getKeys().length === 0;
return true;
} else {
return false;
}
} }
/** /**
* remove object from Objectmap * remove object from Objectmap
*/ */
public remove(objectArg: T) { public remove(objectArg: T): T {
let replacementArray = []; if (this.checkForObject(objectArg)) {
for (let item of this.objectArray) { const keyArg = this.getKeyForObject(objectArg);
if (item !== objectArg) { const removedObject = this.fastMap.removeFromMap(keyArg);
replacementArray.push(item); this.eventSubject.next({
operation: 'remove',
payload: removedObject
});
return removedObject;
} }
} return null;
this.objectArray = replacementArray;
} }
/** /**
* wipe Objectmap * wipe Objectmap
*/ */
public wipe() { public wipe() {
this.objectArray = []; 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);
} }
} }

View File

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

View File

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

41
ts/lik.timedaggregator.ts Normal file
View File

@ -0,0 +1,41 @@
import * as plugins from './lik.plugins';
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();
}
}