Compare commits
89 Commits
Author | SHA1 | Date | |
---|---|---|---|
28b3666aad | |||
b17dd2ed64 | |||
e551a68237 | |||
f402e55ff3 | |||
15b8fe406a | |||
c7557163cd | |||
f84822dd5d | |||
21d6e19a22 | |||
8947738dc1 | |||
14bc5dcd25 | |||
c2f366de7f | |||
ae47276569 | |||
42b59c109d | |||
8f18faaf1c | |||
ccd5b80d67 | |||
298904e17e | |||
fa91e67aef | |||
5e99066bee | |||
a838f7eb80 | |||
979e93be27 | |||
60587f052c | |||
da5bd43a42 | |||
24559d1582 | |||
d92657b130 | |||
f8f34bf8a3 | |||
861d2c04b3 | |||
5845d74160 | |||
9dd952e6b7 | |||
742a711359 | |||
8878a0ef8b | |||
6a52e81cdd | |||
757e709f3f | |||
e0d9c3a3e0 | |||
150953adaf | |||
e0eba5d206 | |||
d9eb836f98 | |||
6d29798660 | |||
f80a84086c | |||
929a6eff07 | |||
87243881bb | |||
5d51c14bd6 | |||
453c6d6ae8 | |||
2e9fe308df | |||
96a71638a0 | |||
1c7582d328 | |||
ccff9b39be | |||
749be9ac60 | |||
7c9ad26519 | |||
6fdf08c8a9 | |||
de04d75e18 | |||
5159d7e4bf | |||
7b78aaea72 | |||
54a63d1f41 | |||
dd5a009d0f | |||
e7933cd7f4 | |||
56a8d9182b | |||
3a971301a4 | |||
b880036b64 | |||
9d756dbff7 | |||
b8111c66ff | |||
8d660a8573 | |||
596a897afc | |||
e1442b1bc8 | |||
2ca9e14f76 | |||
e65f36dfa2 | |||
adb95cd683 | |||
d2106690b4 | |||
2ea5111eb8 | |||
aae10344fe | |||
52b65d7dc3 | |||
1135b418cb | |||
2eb1dbd0b3 | |||
8ec54c17a1 | |||
500a291b2a | |||
256a14fcb0 | |||
7aa0f05bae | |||
6208cab36a | |||
50a9697baf | |||
7956cf6ace | |||
d8956d4e32 | |||
c93a67c351 | |||
fafd9867ad | |||
2dfa96bbc5 | |||
a7484e791a | |||
2dba68df8c | |||
6aff4c9031 | |||
e81e0ebd41 | |||
18866b9a05 | |||
71b12b2d9c |
23
.gitignore
vendored
23
.gitignore
vendored
@ -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
|
117
.gitlab-ci.yml
117
.gitlab-ci.yml
@ -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,56 +19,62 @@ 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 command npm install -g snyk
|
- npmci npm prepare
|
||||||
- npmci command npm install --ignore-scripts
|
- npmci command npm install --production --ignore-scripts
|
||||||
- npmci command snyk test
|
- npmci command npm config set registry https://registry.npmjs.org
|
||||||
|
- npmci command npm audit --audit-level=high --only=prod --production
|
||||||
tags:
|
tags:
|
||||||
- docker
|
- docker
|
||||||
- notpriv
|
allow_failure: true
|
||||||
|
|
||||||
|
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 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 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 node install stable
|
- npmci node install stable
|
||||||
- npmci npm install
|
- npmci npm install
|
||||||
- npmci npm test
|
- npmci npm test
|
||||||
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
|
||||||
@ -78,6 +84,7 @@ release:
|
|||||||
only:
|
only:
|
||||||
- tags
|
- tags
|
||||||
tags:
|
tags:
|
||||||
|
- lossless
|
||||||
- docker
|
- docker
|
||||||
- notpriv
|
- notpriv
|
||||||
|
|
||||||
@ -86,20 +93,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
|
||||||
|
|
||||||
@ -110,16 +113,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 npmpage
|
- npmci node install lts
|
||||||
- npmci command npmpage
|
- npmci command npm install -g @gitzone/tsdoc
|
||||||
|
- npmci npm prepare
|
||||||
|
- npmci npm install
|
||||||
|
- npmci command tsdoc
|
||||||
tags:
|
tags:
|
||||||
|
- lossless
|
||||||
- docker
|
- docker
|
||||||
- notpriv
|
- notpriv
|
||||||
only:
|
only:
|
||||||
@ -129,13 +136,3 @@ pages:
|
|||||||
paths:
|
paths:
|
||||||
- public
|
- public
|
||||||
allow_failure: true
|
allow_failure: true
|
||||||
|
|
||||||
windowsCompatibility:
|
|
||||||
image: stefanscherer/node-windows:10-build-tools
|
|
||||||
stage: metadata
|
|
||||||
script:
|
|
||||||
- npm install & npm test
|
|
||||||
coverage: /\d+.?\d+?\%\s*coverage/
|
|
||||||
tags:
|
|
||||||
- windows
|
|
||||||
allow_failure: true
|
|
||||||
|
29
.vscode/launch.json
vendored
Normal file
29
.vscode/launch.json
vendored
Normal 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
26
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"json.schemas": [
|
||||||
|
{
|
||||||
|
"fileMatch": ["/npmextra.json"],
|
||||||
|
"schema": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"npmci": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "settings for npmci"
|
||||||
|
},
|
||||||
|
"gitzone": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "settings for gitzone",
|
||||||
|
"properties": {
|
||||||
|
"projectType": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["website", "element", "service", "npm", "wcc"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
47
README.md
47
README.md
@ -1,47 +0,0 @@
|
|||||||
# lik
|
|
||||||
|
|
||||||
light little helpers for node
|
|
||||||
|
|
||||||
## Availabililty
|
|
||||||
|
|
||||||
[](https://www.npmjs.com/package/lik)
|
|
||||||
[](https://GitLab.com/pushrocks/lik)
|
|
||||||
[](https://github.com/pushrocks/lik)
|
|
||||||
[](https://pushrocks.gitlab.io/lik/)
|
|
||||||
|
|
||||||
## Status for master
|
|
||||||
|
|
||||||
[](https://GitLab.com/pushrocks/lik/commits/master)
|
|
||||||
[](https://GitLab.com/pushrocks/lik/commits/master)
|
|
||||||
[](https://www.npmjs.com/package/lik)
|
|
||||||
[](https://david-dm.org/pushrocks/lik)
|
|
||||||
[](https://www.bithound.io/github/pushrocks/lik/master/dependencies/npm)
|
|
||||||
[](https://www.bithound.io/github/pushrocks/lik)
|
|
||||||
[](https://snyk.io/test/npm/lik)
|
|
||||||
[](https://nodejs.org/dist/latest-v6.x/docs/api/)
|
|
||||||
[](https://nodejs.org/dist/latest-v6.x/docs/api/)
|
|
||||||
[](http://standardjs.com/)
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
Use TypeScript for best in class instellisense.
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
// import any tool that you need from lik
|
|
||||||
import { Stringmap, Objectmap, Observablemap } from 'lik';
|
|
||||||
```
|
|
||||||
|
|
||||||
### class Stringmap
|
|
||||||
|
|
||||||
Stringmap allows you to keep track of strings. It allows you to register triggers for certain events
|
|
||||||
like when a certain string is removed or added to the map
|
|
||||||
|
|
||||||
### class Objectmap
|
|
||||||
|
|
||||||
Sometimes you need to keep track of objects, but implementing logic for removing, finding or updating is tedious.
|
|
||||||
Objectmap takes care of keeping track of objects for you.
|
|
||||||
|
|
||||||
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
|
|
||||||
> | By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
|
|
||||||
|
|
||||||
[](https://push.rocks)
|
|
@ -1,14 +1,17 @@
|
|||||||
{
|
{
|
||||||
"npmci": {
|
"npmci": {
|
||||||
"npmGlobalTools": [
|
"npmGlobalTools": [],
|
||||||
"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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
28133
package-lock.json
generated
28133
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
51
package.json
51
package.json
@ -1,13 +1,13 @@
|
|||||||
{
|
{
|
||||||
"name": "@pushrocks/lik",
|
"name": "@pushrocks/lik",
|
||||||
"version": "2.0.7",
|
"version": "5.0.1",
|
||||||
"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": "tsrun test/test.ts",
|
"test": "(tstest test/)",
|
||||||
"build": "(npmts)"
|
"build": "(tsbuild --web && tsbundle npm)"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@ -20,16 +20,37 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://gitlab.com/pushrocks/lik#README",
|
"homepage": "https://gitlab.com/pushrocks/lik#README",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@gitzone/tsrun": "^1.1.9",
|
"@gitzone/tsbuild": "^2.1.29",
|
||||||
"@pushrocks/tapbundle": "^3.0.1",
|
"@gitzone/tsbundle": "^1.0.89",
|
||||||
"@types/node": "^10.5.2"
|
"@gitzone/tsrun": "^1.2.18",
|
||||||
|
"@gitzone/tstest": "^1.0.60",
|
||||||
|
"@pushrocks/tapbundle": "^4.0.0",
|
||||||
|
"@types/node": "^17.0.10",
|
||||||
|
"tslint": "^6.1.3",
|
||||||
|
"tslint-config-prettier": "^1.18.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@pushrocks/smartpromise": "^2.0.5",
|
"@pushrocks/smartdelay": "^2.0.13",
|
||||||
"@types/lodash": "^4.14.112",
|
"@pushrocks/smartmatch": "^1.0.7",
|
||||||
"@types/minimatch": "^3.0.3",
|
"@pushrocks/smartpromise": "^3.1.6",
|
||||||
"lodash": "^4.17.10",
|
"@pushrocks/smartrx": "^2.0.20",
|
||||||
"minimatch": "^3.0.4",
|
"@pushrocks/smarttime": "^3.0.43",
|
||||||
"symbol-tree": "^3.2.2"
|
"@types/minimatch": "^3.0.5",
|
||||||
}
|
"symbol-tree": "^3.2.4"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"ts/**/*",
|
||||||
|
"ts_web/**/*",
|
||||||
|
"dist/**/*",
|
||||||
|
"dist_*/**/*",
|
||||||
|
"dist_ts/**/*",
|
||||||
|
"dist_ts_web/**/*",
|
||||||
|
"assets/**/*",
|
||||||
|
"cli.js",
|
||||||
|
"npmextra.json",
|
||||||
|
"readme.md"
|
||||||
|
],
|
||||||
|
"browserslist": [
|
||||||
|
"last 1 chrome versions"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
54
readme.md
Normal file
54
readme.md
Normal 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 | [](https://lossless.cloud)
|
||||||
|
GitLab Pipline Test Coverage | [](https://lossless.cloud)
|
||||||
|
npm | [](https://lossless.cloud)
|
||||||
|
Snyk | [](https://lossless.cloud)
|
||||||
|
TypeScript Support | [](https://lossless.cloud)
|
||||||
|
node Support | [](https://nodejs.org/dist/latest-v10.x/docs/api/)
|
||||||
|
Code Style | [](https://lossless.cloud)
|
||||||
|
PackagePhobia (total standalone install weight) | [](https://lossless.cloud)
|
||||||
|
PackagePhobia (package size on registry) | [](https://lossless.cloud)
|
||||||
|
BundlePhobia (total size when bundled) | [](https://lossless.cloud)
|
||||||
|
Platform support | [](https://lossless.cloud) [](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)
|
||||||
|
|
||||||
|
[](https://maintainedby.lossless.com)
|
28
test/test.fastmap.both.ts
Normal file
28
test/test.fastmap.both.ts
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
import { tap, expect } from '@pushrocks/tapbundle';
|
||||||
|
|
||||||
|
import * as lik from '../ts';
|
||||||
|
|
||||||
|
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');
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.start();
|
25
test/test.interestmap.both.ts
Normal file
25
test/test.interestmap.both.ts
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
import { tap, expect } from '@pushrocks/tapbundle';
|
||||||
|
import * as lik from '../ts/index';
|
||||||
|
|
||||||
|
let testInterestmap: lik.InterestMap<number, number>;
|
||||||
|
|
||||||
|
tap.test('should create an interestmap', async () => {
|
||||||
|
testInterestmap = new lik.InterestMap((numberArg) => {
|
||||||
|
return numberArg.toString();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test('should create an interest', async () => {
|
||||||
|
testInterestmap.addInterest(3);
|
||||||
|
testInterestmap.addInterest(4);
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test('should return an already existing interest', async () => {
|
||||||
|
await testInterestmap.addInterest(3);
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test('should be able to inform about a lost interest', async () => {
|
||||||
|
testInterestmap.informLostInterest(3);
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.start();
|
@ -6,12 +6,12 @@ let testLimitedArray: LimitedArray<string>;
|
|||||||
|
|
||||||
tap.test('should create a LimitedArray', async () => {
|
tap.test('should create a LimitedArray', async () => {
|
||||||
testLimitedArray = new LimitedArray(6);
|
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 () => {
|
tap.test('should never be longer than the set length', async () => {
|
||||||
testLimitedArray.addMany(['hi', 'this', 'is', 'quite', 'a', 'long', 'string', ':)']);
|
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();
|
tap.start();
|
@ -1,7 +1,7 @@
|
|||||||
// import test framework
|
// import test framework
|
||||||
import { expect, tap } from '@pushrocks/tapbundle';
|
import { expect, tap } from '@pushrocks/tapbundle';
|
||||||
import * as events from 'events';
|
import * as events from 'events';
|
||||||
import * as smartq from 'smartq';
|
import * as smartpromise from '@pushrocks/smartpromise';
|
||||||
|
|
||||||
// import the module
|
// import the module
|
||||||
import * as lik from '../ts/index';
|
import * as lik from '../ts/index';
|
||||||
@ -13,14 +13,14 @@ let myLoopTracker: lik.LoopTracker<any>;
|
|||||||
// tests
|
// tests
|
||||||
tap.test('should create a valid looptracker instance', async () => {
|
tap.test('should create a valid looptracker instance', async () => {
|
||||||
myLoopTracker = new lik.LoopTracker();
|
myLoopTracker = new lik.LoopTracker();
|
||||||
expect(myLoopTracker).to.be.instanceof(lik.LoopTracker);
|
expect(myLoopTracker).toBeInstanceOf(lik.LoopTracker);
|
||||||
});
|
});
|
||||||
|
|
||||||
tap.test('should add objects once and return true', async () => {
|
tap.test('should add objects once and return true', async () => {
|
||||||
expect(myLoopTracker.checkAndTrack(object1)).to.be.true;
|
expect(myLoopTracker.checkAndTrack(object1)).toBeTrue();
|
||||||
expect(myLoopTracker.checkAndTrack(object1)).to.be.false;
|
expect(myLoopTracker.checkAndTrack(object1)).toBeFalse();
|
||||||
expect(myLoopTracker.checkAndTrack(object2)).to.be.true;
|
expect(myLoopTracker.checkAndTrack(object2)).toBeTrue();
|
||||||
expect(myLoopTracker.checkAndTrack(object2)).to.be.false;
|
expect(myLoopTracker.checkAndTrack(object2)).toBeFalse();
|
||||||
});
|
});
|
||||||
|
|
||||||
tap.start();
|
tap.start();
|
@ -1,7 +1,7 @@
|
|||||||
// import test framework
|
// import test framework
|
||||||
import { expect, tap } from '@pushrocks/tapbundle';
|
import { expect, tap } from '@pushrocks/tapbundle';
|
||||||
import * as events from 'events';
|
import * as events from 'events';
|
||||||
import * as smartq from 'smartq';
|
import * as smartpromise from '@pushrocks/smartpromise';
|
||||||
|
|
||||||
// import the module
|
// import the module
|
||||||
import * as lik from '../ts/index';
|
import * as lik from '../ts/index';
|
||||||
@ -11,68 +11,68 @@ 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).toBeInstanceOf(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 () => {
|
||||||
testObjectmap.add(testObject1);
|
testObjectmap.add(testObject1);
|
||||||
// tslint:disable-next-line:no-unused-expression
|
// 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
|
// 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 () => {
|
tap.test('lik.Objectmap.remove() -> should correctly remove an object to Objectmap', async () => {
|
||||||
testObjectmap.add(testObject2);
|
testObjectmap.add(testObject2);
|
||||||
testObjectmap.remove(testObject1);
|
testObjectmap.remove(testObject1);
|
||||||
// tslint:disable-next-line:no-unused-expression
|
// 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
|
// 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 () => {
|
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');
|
// TODO expect(itemArg).to.have.property('propOne');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
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 = await testObjectmap.find(async (itemArg) => {
|
||||||
return itemArg.propOne === 'helloThere';
|
return itemArg.propOne === 'helloThere';
|
||||||
});
|
});
|
||||||
// tslint:disable-next-line:no-unused-expression
|
// 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 () => {
|
tap.test('lik.Objectmap.getArray() -> should return a cloned array', async () => {
|
||||||
let myObject = { propOne: 'test1', propTwo: 'wow, how awesome' };
|
let myObject = { propOne: 'test1', propTwo: 'wow, how awesome' };
|
||||||
testObjectmap.add(myObject);
|
testObjectmap.add(myObject);
|
||||||
let clonedArray = testObjectmap.getArray();
|
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 () => {
|
tap.test('should get one object and then remove it', async () => {
|
||||||
let originalLength = testObjectmap.getArray().length;
|
let originalLength = testObjectmap.getArray().length;
|
||||||
let oneObject = testObjectmap.getOneAndRemove();
|
let oneObject = testObjectmap.getOneAndRemove();
|
||||||
// tslint:disable-next-line:no-unused-expression
|
// tslint:disable-next-line:no-unused-expression
|
||||||
expect(oneObject).not.be.null;
|
// TODO expect(oneObject).not.toBeNull();
|
||||||
expect(testObjectmap.getArray().length).equal(originalLength - 1);
|
expect(testObjectmap.getArray().length).toEqual(originalLength - 1);
|
||||||
expect(testObjectmap.getArray()).to.not.contain(oneObject);
|
// TODO expect(testObjectmap.getArray()).to.not.contain(oneObject);
|
||||||
});
|
});
|
||||||
|
|
||||||
tap.start();
|
tap.start();
|
@ -1,7 +1,7 @@
|
|||||||
// import test framework
|
// import test framework
|
||||||
import { expect, tap } from '@pushrocks/tapbundle';
|
import { expect, tap } from '@pushrocks/tapbundle';
|
||||||
import * as events from 'events';
|
import * as events from 'events';
|
||||||
import * as smartq from 'smartq';
|
import * as smartpromise from '@pushrocks/smartpromise';
|
||||||
|
|
||||||
// import the module
|
// import the module
|
||||||
import * as lik from '../ts/index';
|
import * as lik from '../ts/index';
|
||||||
@ -18,14 +18,14 @@ let testString6 = 'testString6';
|
|||||||
// tests
|
// tests
|
||||||
tap.test('new lik.Objectmap() -> should create an instance of Stringmap', async () => {
|
tap.test('new lik.Objectmap() -> should create an instance of Stringmap', async () => {
|
||||||
testStringmap = new lik.Stringmap();
|
testStringmap = new lik.Stringmap();
|
||||||
expect(testStringmap).be.instanceof(lik.Stringmap);
|
expect(testStringmap).toBeInstanceOf(lik.Stringmap);
|
||||||
});
|
});
|
||||||
|
|
||||||
tap.test(
|
tap.test(
|
||||||
'lik.Stringmap.checkString -> should return false for an string not in Stringmap',
|
'lik.Stringmap.checkString -> should return false for an string not in Stringmap',
|
||||||
async () => {
|
async () => {
|
||||||
// tslint:disable-next-line:no-unused-expression
|
// tslint:disable-next-line:no-unused-expression
|
||||||
expect(testStringmap.checkString(testString1)).be.false;
|
expect(testStringmap.checkString(testString1)).toBeFalse();
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -34,37 +34,37 @@ tap.test('lik.Stringmap.addString -> should add an string to Stringmap', async (
|
|||||||
testStringmap.addString(testString2);
|
testStringmap.addString(testString2);
|
||||||
testStringmap.addString(testString3);
|
testStringmap.addString(testString3);
|
||||||
// tslint:disable-next-line:no-unused-expression
|
// 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
|
// 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
|
// 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
|
// 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
|
// 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
|
// 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 () => {
|
tap.test('lik.Stringmap.addStringArray -> should add an array of strings', async () => {
|
||||||
testStringmap.addStringArray([testString4, testString5, testString6]);
|
testStringmap.addStringArray([testString4, testString5, testString6]);
|
||||||
// tslint:disable-next-line:no-unused-expression
|
// 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 () => {
|
tap.test('lik.Stringmap.removeString -> should remove a string from Stringmap', async () => {
|
||||||
testStringmap.removeString(testString2);
|
testStringmap.removeString(testString2);
|
||||||
// tslint:disable-next-line:no-unused-expression
|
// 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 () => {
|
tap.test('lik.Stringmap.getStringArray() -> should return a copy of stringArray', async () => {
|
||||||
let clonedArray = testStringmap.getStringArray();
|
let clonedArray = testStringmap.getStringArray();
|
||||||
// tslint:disable-next-line:no-unused-expression
|
// 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
|
// tslint:disable-next-line:no-unused-expression
|
||||||
expect(clonedArray[0] === testString1).be.true;
|
expect(clonedArray[0] === testString1).toBeTrue();
|
||||||
});
|
});
|
||||||
|
|
||||||
tap.test(
|
tap.test(
|
25
test/test.timedaggregator.both.ts
Normal file
25
test/test.timedaggregator.both.ts
Normal 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();
|
40
test/test.tree.both.ts
Normal file
40
test/test.tree.both.ts
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
import { tap, expect } from '@pushrocks/tapbundle';
|
||||||
|
import * as lik from '../ts/index';
|
||||||
|
|
||||||
|
class TestClass {
|
||||||
|
constructor(public hey: string) {
|
||||||
|
// nothing here
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let testTree = new lik.Tree<TestClass>();
|
||||||
|
|
||||||
|
let testInstance = new TestClass('first');
|
||||||
|
let testInstance2 = new TestClass('second');
|
||||||
|
let testInstance3 = new TestClass('third');
|
||||||
|
let testInstance4 = new TestClass('fourth');
|
||||||
|
let testInstance5 = new TestClass('fifth');
|
||||||
|
let testInstance6 = new TestClass('sixth');
|
||||||
|
|
||||||
|
tap.test('create a valid tree instance', async () => {
|
||||||
|
testTree = new lik.Tree();
|
||||||
|
expect(testTree).toBeInstanceOf(lik.Tree);
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test('should insert an object', async () => {
|
||||||
|
testTree.initialize(testInstance);
|
||||||
|
let resultArray = testTree.treeToArray(testInstance, {});
|
||||||
|
// TODO expect(resultArray).toContain(testInstance);
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test('should add other objects in a hierachy', async () => {
|
||||||
|
testTree.appendChild(testInstance, testInstance2);
|
||||||
|
testTree.appendChild(testInstance, testInstance3);
|
||||||
|
testTree.appendChild(testInstance, testInstance4);
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test("should create a JSON object that reflects a tree's hierachy", async () => {
|
||||||
|
const jsonTreet = testTree.toJsonWithHierachy(testInstance);
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.start();
|
@ -1,24 +0,0 @@
|
|||||||
import { tap, expect } from '@pushrocks/tapbundle';
|
|
||||||
import * as lik from '../ts/index';
|
|
||||||
|
|
||||||
let testTree = new lik.Tree<TestClass>();
|
|
||||||
|
|
||||||
class TestClass {
|
|
||||||
constructor(public hey: string) {
|
|
||||||
// nothing here
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let testInstance = new TestClass('first');
|
|
||||||
|
|
||||||
tap.test('create a valid tree instance', async () => {
|
|
||||||
testTree = new lik.Tree();
|
|
||||||
expect(testTree).to.be.instanceOf(lik.Tree);
|
|
||||||
});
|
|
||||||
|
|
||||||
tap.test('should insert an object', async () => {
|
|
||||||
testTree.initialize(testInstance);
|
|
||||||
let resultArray = testTree.treeToArray(testInstance, {});
|
|
||||||
expect(resultArray).to.contain(testInstance);
|
|
||||||
});
|
|
||||||
|
|
||||||
tap.start();
|
|
@ -1 +0,0 @@
|
|||||||
import './test.objectmap';
|
|
10
ts/index.ts
10
ts/index.ts
@ -1,9 +1,9 @@
|
|||||||
import * as plugins from './lik.plugins';
|
export * from './lik.fastmap';
|
||||||
|
export * from './lik.interestmap';
|
||||||
// import modules
|
export * from './lik.interestmap.interest';
|
||||||
|
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.limitedarray';
|
export * from './lik.timedaggregator';
|
||||||
export * from './lik.tree';
|
export * from './lik.tree';
|
||||||
|
92
ts/lik.fastmap.ts
Normal file
92
ts/lik.fastmap.ts
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
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(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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
94
ts/lik.interestmap.interest.ts
Normal file
94
ts/lik.interestmap.interest.ts
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
import * as plugins from './lik.plugins';
|
||||||
|
|
||||||
|
import { InterestMap, IInterestComparisonFunc } from './lik.interestmap';
|
||||||
|
|
||||||
|
export interface IInterestOptions<DTInterestFullfillment> {
|
||||||
|
markLostAfterDefault: number;
|
||||||
|
defaultFullfillment?: DTInterestFullfillment;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Interest<DTInterestId, DTInterestFullfillment> {
|
||||||
|
public options: IInterestOptions<DTInterestFullfillment>;
|
||||||
|
|
||||||
|
private interestMapRef: InterestMap<DTInterestId, DTInterestFullfillment>;
|
||||||
|
public originalInterest: DTInterestId;
|
||||||
|
public comparisonFunc: IInterestComparisonFunc<DTInterestId>;
|
||||||
|
public destructionTimer = new plugins.smarttime.Timer(10000);
|
||||||
|
public isFullfilled = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* a generic store to store objects in that are needed for fullfillment;
|
||||||
|
*/
|
||||||
|
public fullfillmentStore: any[] = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* quick access to a string that makes the interest comparable for checking for similar interests
|
||||||
|
*/
|
||||||
|
public get comparisonString() {
|
||||||
|
return this.comparisonFunc(this.originalInterest);
|
||||||
|
}
|
||||||
|
|
||||||
|
private interestDeferred: plugins.smartpromise.Deferred<
|
||||||
|
DTInterestFullfillment
|
||||||
|
> = new plugins.smartpromise.Deferred();
|
||||||
|
public interestFullfilled = this.interestDeferred.promise;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fullfill the interest
|
||||||
|
*/
|
||||||
|
public fullfillInterest(objectArg: DTInterestFullfillment) {
|
||||||
|
this.isFullfilled = true;
|
||||||
|
this.fullfillmentStore = [];
|
||||||
|
this.interestDeferred.resolve(objectArg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
constructor(
|
||||||
|
interestMapArg: InterestMap<DTInterestId, DTInterestFullfillment>,
|
||||||
|
interestArg: DTInterestId,
|
||||||
|
comparisonFuncArg: IInterestComparisonFunc<DTInterestId>,
|
||||||
|
optionsArg?: IInterestOptions<DTInterestFullfillment>
|
||||||
|
) {
|
||||||
|
this.interestMapRef = interestMapArg;
|
||||||
|
this.originalInterest = interestArg;
|
||||||
|
this.comparisonFunc = comparisonFuncArg;
|
||||||
|
this.options = optionsArg;
|
||||||
|
|
||||||
|
this.destructionTimer.completed.then(() => {
|
||||||
|
this.destroy();
|
||||||
|
});
|
||||||
|
if (this.options?.markLostAfterDefault) {
|
||||||
|
plugins.smartdelay.delayFor(this.options.markLostAfterDefault).then(this.markLost);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ===============================
|
||||||
|
// LIFECYCLE MANAGEMENT
|
||||||
|
// ===============================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* self destructs the interest
|
||||||
|
*/
|
||||||
|
public destroy() {
|
||||||
|
this.interestMapRef.removeInterest(this);
|
||||||
|
if (!this.isFullfilled && this.options.defaultFullfillment) {
|
||||||
|
this.fullfillInterest(this.options.defaultFullfillment);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* notifies the interest that the interest in it has been lost
|
||||||
|
*/
|
||||||
|
public markLost() {
|
||||||
|
this.destructionTimer.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* notifies the interest that the interest in it has been restored
|
||||||
|
*/
|
||||||
|
public renew() {
|
||||||
|
this.destructionTimer.reset();
|
||||||
|
}
|
||||||
|
}
|
129
ts/lik.interestmap.ts
Normal file
129
ts/lik.interestmap.ts
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
import * as plugins from './lik.plugins';
|
||||||
|
import { ObjectMap } from './lik.objectmap';
|
||||||
|
|
||||||
|
import { Observable } from 'rxjs';
|
||||||
|
|
||||||
|
import { Interest } from './lik.interestmap.interest';
|
||||||
|
|
||||||
|
export type IInterestComparisonFunc<T> = (objectArg: T) => string;
|
||||||
|
|
||||||
|
export interface IInterestMapOptions {
|
||||||
|
markLostAfterDefault?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class InterestMap<DTInterestId, DTInterestFullfillment> {
|
||||||
|
public options: IInterestMapOptions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* stores interests that are currently fullfilled by the cache
|
||||||
|
*/
|
||||||
|
private interestObjectMap = new ObjectMap<Interest<DTInterestId, DTInterestFullfillment>>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* a function to compare interests
|
||||||
|
*/
|
||||||
|
private comparisonFunc: IInterestComparisonFunc<DTInterestId>;
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
comparisonFuncArg: IInterestComparisonFunc<DTInterestId>,
|
||||||
|
optionsArg: IInterestMapOptions = {}
|
||||||
|
) {
|
||||||
|
this.comparisonFunc = comparisonFuncArg;
|
||||||
|
this.options = optionsArg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* adds an interest to the InterestMap
|
||||||
|
* @param objectArg
|
||||||
|
*/
|
||||||
|
public async addInterest(
|
||||||
|
objectArg: DTInterestId,
|
||||||
|
defaultFullfillmentArg?: DTInterestFullfillment
|
||||||
|
): Promise<Interest<DTInterestId, DTInterestFullfillment>> {
|
||||||
|
const comparisonString = this.comparisonFunc(objectArg);
|
||||||
|
let returnInterest: Interest<DTInterestId, DTInterestFullfillment>;
|
||||||
|
const newInterest = new Interest<DTInterestId, DTInterestFullfillment>(
|
||||||
|
this,
|
||||||
|
objectArg,
|
||||||
|
this.comparisonFunc,
|
||||||
|
{
|
||||||
|
markLostAfterDefault: this.options.markLostAfterDefault,
|
||||||
|
defaultFullfillment: defaultFullfillmentArg,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
let interestExists = false;
|
||||||
|
await this.interestObjectMap.forEach((interestArg) => {
|
||||||
|
if (!interestExists && interestArg.comparisonString === newInterest.comparisonString) {
|
||||||
|
console.log('info', `interest already exists for ${newInterest.comparisonString}`);
|
||||||
|
interestExists = true;
|
||||||
|
returnInterest = interestArg;
|
||||||
|
returnInterest.renew();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (!returnInterest) {
|
||||||
|
returnInterest = newInterest;
|
||||||
|
this.interestObjectMap.add(returnInterest);
|
||||||
|
}
|
||||||
|
this.interestObservable.push(returnInterest);
|
||||||
|
return returnInterest;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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.findOneAndRemoveSync((interestArg2) => {
|
||||||
|
return interestArg.comparisonString === interestArg2.comparisonString;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check interest
|
||||||
|
*/
|
||||||
|
public checkInterest(objectArg: DTInterestId): boolean {
|
||||||
|
const comparisonString = this.comparisonFunc(objectArg);
|
||||||
|
return this.checkInterestByString(comparisonString);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* checks an interest
|
||||||
|
* @param comparisonStringArg
|
||||||
|
*/
|
||||||
|
public checkInterestByString(comparisonStringArg: string): boolean {
|
||||||
|
const foundInterest = this.interestObjectMap.findSync((interest) => {
|
||||||
|
return interest.comparisonString === comparisonStringArg;
|
||||||
|
});
|
||||||
|
if (foundInterest) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* inform lost interest
|
||||||
|
* @param interestId
|
||||||
|
*/
|
||||||
|
public informLostInterest(interestId: DTInterestId) {
|
||||||
|
const wantedInterest = this.findInterest(interestId);
|
||||||
|
if (wantedInterest) {
|
||||||
|
wantedInterest.markLost();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* finds an interest
|
||||||
|
* @param objectArg
|
||||||
|
*/
|
||||||
|
public findInterest(objectArg: DTInterestId): Interest<DTInterestId, DTInterestFullfillment> {
|
||||||
|
const comparableString = this.comparisonFunc(objectArg);
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,18 +1,39 @@
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IObjectmapFindFunction<T> {
|
export interface IObjectmapFindFunctionSync<T> {
|
||||||
(itemArg: T): boolean;
|
(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
|
* 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 +42,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
|
||||||
*/
|
*/
|
||||||
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
|
||||||
*/
|
*/
|
||||||
addArray(objectArrayArg: T[]) {
|
public addArray(objectArrayArg: T[]) {
|
||||||
for (let item of objectArrayArg) {
|
for (const item of objectArrayArg) {
|
||||||
this.add(item);
|
this.add(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -49,27 +102,53 @@ export class Objectmap<T> {
|
|||||||
/**
|
/**
|
||||||
* check if object is in Objectmap
|
* check if object is in Objectmap
|
||||||
*/
|
*/
|
||||||
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
|
||||||
*/
|
*/
|
||||||
find(findFunction: IObjectmapFindFunction<T>) {
|
public async find(findFunction: IObjectmapFindFunction<T>): Promise<T> {
|
||||||
let resultArray = this.objectArray.filter(findFunction);
|
return this.fastMap.find(findFunction);
|
||||||
if (resultArray.length > 0) {
|
}
|
||||||
return resultArray[0];
|
|
||||||
} else {
|
public findSync(findFunction: IObjectmapFindFunctionSync<T>): T {
|
||||||
return null;
|
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
|
* finds a specific element and then removes it
|
||||||
*/
|
*/
|
||||||
findOneAndRemove(findFunction: IObjectmapFindFunction<T>): T {
|
public async findOneAndRemove(findFunction: IObjectmapFindFunction<T>): Promise<T> {
|
||||||
let foundElement = this.find(findFunction);
|
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) {
|
if (foundElement) {
|
||||||
this.remove(foundElement);
|
this.remove(foundElement);
|
||||||
}
|
}
|
||||||
@ -79,54 +158,89 @@ export class Objectmap<T> {
|
|||||||
/**
|
/**
|
||||||
* run function for each item in Objectmap
|
* run function for each item in Objectmap
|
||||||
*/
|
*/
|
||||||
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
||||||
*/
|
*/
|
||||||
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
|
||||||
*/
|
*/
|
||||||
getArray() {
|
public getArray(): T[] {
|
||||||
return plugins.lodash.cloneDeep(this.objectArray);
|
const returnArray: any[] = [];
|
||||||
|
for (const keyArg of this.fastMap.getKeys()) {
|
||||||
|
returnArray.push(this.fastMap.getByKey(keyArg));
|
||||||
|
}
|
||||||
|
return returnArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* check if Objectmap ist empty
|
* check if Objectmap ist empty
|
||||||
*/
|
*/
|
||||||
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
|
||||||
*/
|
*/
|
||||||
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
|
||||||
*/
|
*/
|
||||||
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,17 @@
|
|||||||
import * as events from 'events';
|
// ==============
|
||||||
import * as lodash from 'lodash';
|
// @pushrocks
|
||||||
import * as minimatch from 'minimatch';
|
// ==============
|
||||||
|
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 smarttime from '@pushrocks/smarttime';
|
||||||
|
|
||||||
|
export { smartdelay, smartmatch, smartpromise, smartrx, smarttime };
|
||||||
|
|
||||||
|
// ==============
|
||||||
|
// third party
|
||||||
|
// ==============
|
||||||
const symbolTree = require('symbol-tree');
|
const symbolTree = require('symbol-tree');
|
||||||
|
|
||||||
export { events, lodash, minimatch, smartpromise, symbolTree };
|
export { symbolTree };
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
@ -52,17 +50,18 @@ export class Stringmap {
|
|||||||
/**
|
/**
|
||||||
* check if string is in Stringmap
|
* check if string is in Stringmap
|
||||||
*/
|
*/
|
||||||
checkString(stringArg: string): boolean {
|
public checkString(stringArg: string): boolean {
|
||||||
return this._stringArray.indexOf(stringArg) !== -1;
|
return this._stringArray.indexOf(stringArg) !== -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* checks stringPresence with minimatch
|
* checks stringPresence with minimatch
|
||||||
*/
|
*/
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -72,15 +71,19 @@ export class Stringmap {
|
|||||||
/**
|
/**
|
||||||
* checks if the Stringmap is empty
|
* checks if the Stringmap is empty
|
||||||
*/
|
*/
|
||||||
checkIsEmpty() {
|
public checkIsEmpty() {
|
||||||
return this._stringArray.length === 0;
|
return this._stringArray.length === 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gets a cloned copy of the current string Array
|
* gets a cloned copy of the current string Array
|
||||||
*/
|
*/
|
||||||
getStringArray() {
|
public getStringArray() {
|
||||||
return plugins.lodash.cloneDeep(this._stringArray);
|
const returnArray: string[] = [];
|
||||||
|
for (const stringItem of this._stringArray) {
|
||||||
|
returnArray.push(stringItem);
|
||||||
|
}
|
||||||
|
return returnArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
// trigger registering
|
// trigger registering
|
||||||
@ -88,22 +91,27 @@ export class Stringmap {
|
|||||||
/**
|
/**
|
||||||
* register a new trigger
|
* register a new trigger
|
||||||
*/
|
*/
|
||||||
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
41
ts/lik.timedaggregator.ts
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
@ -6,6 +6,10 @@ export class Tree<T> {
|
|||||||
this.symbolTree = new plugins.symbolTree();
|
this.symbolTree = new plugins.symbolTree();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// =======================================
|
||||||
|
// Functions that map to the functionality of symbol-tree
|
||||||
|
// =======================================
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param objectArg
|
* @param objectArg
|
||||||
@ -58,15 +62,15 @@ export class Tree<T> {
|
|||||||
return this.symbolTree.ancestorsToArray(objectArg, optionsArg);
|
return this.symbolTree.ancestorsToArray(objectArg, optionsArg);
|
||||||
}
|
}
|
||||||
|
|
||||||
treeToArray(rootArg, optionsArg: any): T[] {
|
treeToArray(rootArg: T, optionsArg: any): T[] {
|
||||||
return this.symbolTree.treeToArray(rootArg, optionsArg);
|
return this.symbolTree.treeToArray(rootArg, optionsArg);
|
||||||
}
|
}
|
||||||
|
|
||||||
childrenIterator(parentArg: T, optionsArg): T {
|
childrenIterator(parentArg: T, optionsArg: any): T {
|
||||||
return this.symbolTree.childrenIterator(parentArg, optionsArg);
|
return this.symbolTree.childrenIterator(parentArg, optionsArg);
|
||||||
}
|
}
|
||||||
|
|
||||||
previousSiblingsIterator(objectArg): T {
|
previousSiblingsIterator(objectArg: T): T {
|
||||||
return this.symbolTree.previousSiblingsIterator(objectArg);
|
return this.symbolTree.previousSiblingsIterator(objectArg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,11 +78,11 @@ export class Tree<T> {
|
|||||||
return this.symbolTree.nextSiblingsIterator();
|
return this.symbolTree.nextSiblingsIterator();
|
||||||
}
|
}
|
||||||
|
|
||||||
ancestorsIterator(objectArg) {
|
ancestorsIterator(objectArg: T) {
|
||||||
this.symbolTree.ancestorsIterator();
|
this.symbolTree.ancestorsIterator();
|
||||||
}
|
}
|
||||||
|
|
||||||
treeIterator(rootArg: T, optionsArg): T {
|
treeIterator(rootArg: T, optionsArg: any): Iterable<T> {
|
||||||
return this.symbolTree.treeIterator(rootArg);
|
return this.symbolTree.treeIterator(rootArg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,7 +114,28 @@ export class Tree<T> {
|
|||||||
return this.symbolTree.prependChild(referenceObjectArg, newObjectArg);
|
return this.symbolTree.prependChild(referenceObjectArg, newObjectArg);
|
||||||
}
|
}
|
||||||
|
|
||||||
appendChild(referenceObjectArg, newObjectArg) {
|
appendChild(referenceObjectArg: T, newObjectArg: T) {
|
||||||
return this.symbolTree.appendChild(referenceObjectArg, newObjectArg);
|
return this.symbolTree.appendChild(referenceObjectArg, newObjectArg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ===========================================
|
||||||
|
// Functionionality that extends symbol-tree
|
||||||
|
// ===========================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* returns a branch of the tree as JSON
|
||||||
|
* can be user
|
||||||
|
*/
|
||||||
|
toJsonWithHierachy(rootElement: T) {
|
||||||
|
const treeIterable = this.treeIterator(rootElement, {});
|
||||||
|
for (const treeItem of treeIterable) {
|
||||||
|
console.log(treeItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* builds a tree from a JSON with hierachy
|
||||||
|
* @param rootElement
|
||||||
|
*/
|
||||||
|
fromJsonWithHierachy(rootElement: T) {}
|
||||||
}
|
}
|
||||||
|
16
tslint.json
16
tslint.json
@ -1,3 +1,17 @@
|
|||||||
{
|
{
|
||||||
"extends": "tslint-config-standard"
|
"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"
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user