Compare commits
38 Commits
Author | SHA1 | Date | |
---|---|---|---|
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 |
4
.gitignore
vendored
4
.gitignore
vendored
@ -15,8 +15,6 @@ node_modules/
|
|||||||
|
|
||||||
# builds
|
# builds
|
||||||
dist/
|
dist/
|
||||||
dist_web/
|
dist_*/
|
||||||
dist_serve/
|
|
||||||
dist_ts_web/
|
|
||||||
|
|
||||||
# custom
|
# custom
|
@ -3,14 +3,14 @@ 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
|
||||||
@ -18,60 +18,66 @@ stages:
|
|||||||
mirror:
|
mirror:
|
||||||
stage: security
|
stage: security
|
||||||
script:
|
script:
|
||||||
- npmci git mirror
|
- npmci git mirror
|
||||||
tags:
|
tags:
|
||||||
- docker
|
- lossless
|
||||||
- notpriv
|
- docker
|
||||||
|
- notpriv
|
||||||
|
|
||||||
snyk:
|
audit:
|
||||||
|
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 --ignore-scripts
|
- npmci command npm install --ignore-scripts
|
||||||
- npmci command snyk test
|
- npmci command npm config set registry https://registry.npmjs.org
|
||||||
|
- npmci command npm audit --audit-level=high
|
||||||
tags:
|
tags:
|
||||||
- docker
|
- lossless
|
||||||
- notpriv
|
- docker
|
||||||
|
- notpriv
|
||||||
|
|
||||||
# ====================
|
# ====================
|
||||||
# test stage
|
# test stage
|
||||||
# ====================
|
# ====================
|
||||||
|
|
||||||
testLTS:
|
testStable:
|
||||||
stage: test
|
stage: test
|
||||||
script:
|
script:
|
||||||
- npmci npm prepare
|
- npmci npm prepare
|
||||||
- npmci node install lts
|
- 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
|
- lossless
|
||||||
- notpriv
|
- docker
|
||||||
|
- priv
|
||||||
|
|
||||||
testBuild:
|
testBuild:
|
||||||
stage: test
|
stage: test
|
||||||
script:
|
script:
|
||||||
- npmci npm prepare
|
- npmci npm prepare
|
||||||
- npmci node install lts
|
- npmci node install stable
|
||||||
- npmci npm install
|
- npmci npm install
|
||||||
- npmci command npm run build
|
- npmci command npm run build
|
||||||
coverage: /\d+.?\d+?\%\s*coverage/
|
coverage: /\d+.?\d+?\%\s*coverage/
|
||||||
tags:
|
tags:
|
||||||
- docker
|
- lossless
|
||||||
- notpriv
|
- docker
|
||||||
|
- notpriv
|
||||||
|
|
||||||
release:
|
release:
|
||||||
stage: release
|
stage: release
|
||||||
script:
|
script:
|
||||||
- npmci node install lts
|
- npmci node install stable
|
||||||
- npmci npm publish
|
- npmci npm publish
|
||||||
only:
|
only:
|
||||||
- tags
|
- tags
|
||||||
tags:
|
tags:
|
||||||
- docker
|
- lossless
|
||||||
- notpriv
|
- docker
|
||||||
|
- notpriv
|
||||||
|
|
||||||
# ====================
|
# ====================
|
||||||
# metadata stage
|
# metadata stage
|
||||||
@ -81,33 +87,35 @@ codequality:
|
|||||||
allow_failure: true
|
allow_failure: true
|
||||||
script:
|
script:
|
||||||
- npmci command npm install -g tslint typescript
|
- npmci command npm install -g tslint typescript
|
||||||
|
- npmci npm prepare
|
||||||
- npmci npm install
|
- npmci npm install
|
||||||
- npmci command "tslint -c tslint.json ./ts/**/*.ts"
|
- npmci command "tslint -c tslint.json ./ts/**/*.ts"
|
||||||
tags:
|
tags:
|
||||||
- docker
|
- lossless
|
||||||
- priv
|
- docker
|
||||||
|
- priv
|
||||||
|
|
||||||
trigger:
|
trigger:
|
||||||
stage: metadata
|
stage: metadata
|
||||||
script:
|
script:
|
||||||
- npmci trigger
|
- npmci trigger
|
||||||
only:
|
only:
|
||||||
- tags
|
- tags
|
||||||
tags:
|
tags:
|
||||||
- docker
|
- lossless
|
||||||
- notpriv
|
- docker
|
||||||
|
- notpriv
|
||||||
|
|
||||||
pages:
|
pages:
|
||||||
image: hosttoday/ht-docker-dbase:npmci
|
|
||||||
services:
|
|
||||||
- docker:18-dind
|
|
||||||
stage: metadata
|
stage: metadata
|
||||||
script:
|
script:
|
||||||
|
- npmci node install lts
|
||||||
- npmci command npm install -g @gitzone/tsdoc
|
- npmci command npm install -g @gitzone/tsdoc
|
||||||
- npmci npm prepare
|
- npmci npm prepare
|
||||||
- npmci npm install
|
- npmci npm install
|
||||||
- npmci command tsdoc
|
- npmci command tsdoc
|
||||||
tags:
|
tags:
|
||||||
|
- lossless
|
||||||
- docker
|
- docker
|
||||||
- notpriv
|
- notpriv
|
||||||
only:
|
only:
|
||||||
@ -115,5 +123,5 @@ pages:
|
|||||||
artifacts:
|
artifacts:
|
||||||
expire_in: 1 week
|
expire_in: 1 week
|
||||||
paths:
|
paths:
|
||||||
- public
|
- public
|
||||||
allow_failure: true
|
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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
27
.vscode/settings.json
vendored
27
.vscode/settings.json
vendored
@ -1,3 +1,26 @@
|
|||||||
{
|
{
|
||||||
"workbench.colorCustomizations": {}
|
"json.schemas": [
|
||||||
}
|
{
|
||||||
|
"fileMatch": ["/npmextra.json"],
|
||||||
|
"schema": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"npmci": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "settings for npmci"
|
||||||
|
},
|
||||||
|
"gitzone": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "settings for gitzone",
|
||||||
|
"properties": {
|
||||||
|
"projectType": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["website", "element", "service", "npm"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
"npmAccessLevel": "public"
|
"npmAccessLevel": "public"
|
||||||
},
|
},
|
||||||
"gitzone": {
|
"gitzone": {
|
||||||
|
"projectType": "npm",
|
||||||
"module": {
|
"module": {
|
||||||
"githost": "gitlab.com",
|
"githost": "gitlab.com",
|
||||||
"gitscope": "pushrocks",
|
"gitscope": "pushrocks",
|
||||||
|
3177
package-lock.json
generated
3177
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
43
package.json
43
package.json
@ -1,13 +1,13 @@
|
|||||||
{
|
{
|
||||||
"name": "@pushrocks/lik",
|
"name": "@pushrocks/lik",
|
||||||
"version": "3.0.8",
|
"version": "4.0.8",
|
||||||
"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 && tsbundle npm)"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@ -20,30 +20,33 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://gitlab.com/pushrocks/lik#README",
|
"homepage": "https://gitlab.com/pushrocks/lik#README",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@gitzone/tsbuild": "^2.1.11",
|
"@gitzone/tsbuild": "^2.1.24",
|
||||||
|
"@gitzone/tsbundle": "^1.0.69",
|
||||||
"@gitzone/tsrun": "^1.2.8",
|
"@gitzone/tsrun": "^1.2.8",
|
||||||
"@gitzone/tstest": "^1.0.24",
|
"@gitzone/tstest": "^1.0.28",
|
||||||
"@pushrocks/tapbundle": "^3.0.11",
|
"@pushrocks/tapbundle": "^3.2.1",
|
||||||
"@types/node": "^12.6.9",
|
"@types/node": "^14.0.5",
|
||||||
"tslint": "^5.18.0",
|
"tslint": "^6.1.2",
|
||||||
"tslint-config-prettier": "^1.18.0"
|
"tslint-config-prettier": "^1.18.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@pushrocks/smartdelay": "^2.0.3",
|
"@pushrocks/smartdelay": "^2.0.9",
|
||||||
"@pushrocks/smartpromise": "^3.0.2",
|
"@pushrocks/smartmatch": "^1.0.7",
|
||||||
"@pushrocks/smartrx": "^2.0.3",
|
"@pushrocks/smartpromise": "^3.0.6",
|
||||||
"@pushrocks/smarttime": "^3.0.12",
|
"@pushrocks/smartrx": "^2.0.10",
|
||||||
|
"@pushrocks/smarttime": "^3.0.18",
|
||||||
|
"@pushrocks/smartunique": "^3.0.3",
|
||||||
"@types/minimatch": "^3.0.3",
|
"@types/minimatch": "^3.0.3",
|
||||||
"minimatch": "^3.0.4",
|
|
||||||
"symbol-tree": "^3.2.4"
|
"symbol-tree": "^3.2.4"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"ts/*",
|
"ts/**/*",
|
||||||
"ts_web/*",
|
"ts_web/**/*",
|
||||||
"dist/*",
|
"dist/**/*",
|
||||||
"dist_web/*",
|
"dist_*/**/*",
|
||||||
"dist_ts_web/*",
|
"dist_ts/**/*",
|
||||||
"assets/*",
|
"dist_ts_web/**/*",
|
||||||
|
"assets/**/*",
|
||||||
"cli.js",
|
"cli.js",
|
||||||
"npmextra.json",
|
"npmextra.json",
|
||||||
"readme.md"
|
"readme.md"
|
||||||
|
@ -8,7 +8,7 @@ light little helpers for node
|
|||||||
* [docs (typedoc)](https://pushrocks.gitlab.io/lik/)
|
* [docs (typedoc)](https://pushrocks.gitlab.io/lik/)
|
||||||
|
|
||||||
## Status for master
|
## Status for master
|
||||||
[](https://gitlab.com/pushrocks/lik/commits/master)
|
[](https://gitlab.com/pushrocks/lik/commits/master)
|
||||||
[](https://gitlab.com/pushrocks/lik/commits/master)
|
[](https://gitlab.com/pushrocks/lik/commits/master)
|
||||||
[](https://www.npmjs.com/package/@pushrocks/lik)
|
[](https://www.npmjs.com/package/@pushrocks/lik)
|
||||||
[](https://snyk.io/test/npm/@pushrocks/lik)
|
[](https://snyk.io/test/npm/@pushrocks/lik)
|
||||||
@ -35,9 +35,13 @@ like when a certain string is removed or added to the map
|
|||||||
Sometimes you need to keep track of objects, but implementing logic for removing, finding or updating is tedious.
|
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.
|
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.
|
For further information read the linked docs at the top of this readme.
|
||||||
|
|
||||||
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
|
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
|
||||||
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
|
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
|
||||||
|
|
||||||
[](https://maintainedby.lossless.com)
|
[](https://maintainedby.lossless.com)
|
@ -11,7 +11,7 @@ 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'
|
||||||
@ -22,8 +22,8 @@ let testObject2: ITestObject = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
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 () => {
|
||||||
|
@ -1,7 +1,4 @@
|
|||||||
import * as plugins from './lik.plugins';
|
export * from './lik.fastmap';
|
||||||
|
|
||||||
// import modules
|
|
||||||
|
|
||||||
export * from './lik.interestmap';
|
export * from './lik.interestmap';
|
||||||
export * from './lik.limitedarray';
|
export * from './lik.limitedarray';
|
||||||
export * from './lik.looptracker';
|
export * from './lik.looptracker';
|
||||||
|
82
ts/lik.fastmap.ts
Normal file
82
ts/lik.fastmap.ts
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
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): 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 Objectmap that includes
|
||||||
|
*/
|
||||||
|
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 Objectmap
|
||||||
|
* Note: uniqueKeyCollisions will cause overwrite
|
||||||
|
* @param objectMapArg
|
||||||
|
*/
|
||||||
|
public addAllFromOther(fastMapArg: FastMap<T>) {
|
||||||
|
for (const key of fastMapArg.getKeys()) {
|
||||||
|
this.addToMap(key, fastMapArg.getByKey(key), {
|
||||||
|
force: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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';
|
||||||
|
|
||||||
@ -11,7 +11,7 @@ export class InterestMap<DTInterestId, DTInterestFullfillment> {
|
|||||||
/**
|
/**
|
||||||
* 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
|
||||||
@ -106,8 +106,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
|
||||||
}
|
}
|
||||||
|
@ -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,4 +1,5 @@
|
|||||||
import * as plugins from './lik.plugins';
|
import * as plugins from './lik.plugins';
|
||||||
|
import { FastMap } from './lik.fastmap';
|
||||||
|
|
||||||
export interface IObjectmapForEachFunction<T> {
|
export interface IObjectmapForEachFunction<T> {
|
||||||
(itemArg: T): void;
|
(itemArg: T): void;
|
||||||
@ -11,8 +12,11 @@ export interface IObjectmapFindFunction<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<any>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* returns a new instance
|
* returns a new instance
|
||||||
@ -21,27 +25,55 @@ 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 = plugins.smartunique.shortId();
|
||||||
|
this.addMappedUnique(uniqueKey, 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 +81,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 +127,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,7 +136,15 @@ 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('remove');
|
||||||
|
return removedItem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -97,8 +152,8 @@ export class Objectmap<T> {
|
|||||||
*/
|
*/
|
||||||
public getArray(): T[] {
|
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 +162,47 @@ 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('remove');
|
||||||
}
|
return removedObject;
|
||||||
}
|
}
|
||||||
this.objectArray = replacementArray;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,25 +1,18 @@
|
|||||||
// ==============
|
|
||||||
// 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';
|
||||||
|
import * as smartunique from '@pushrocks/smartunique';
|
||||||
|
|
||||||
export { smartdelay, smartpromise, smartrx, smarttime };
|
export { smartdelay, smartmatch, smartpromise, smartrx, smarttime, smartunique };
|
||||||
|
|
||||||
// ==============
|
// ==============
|
||||||
// third party
|
// third party
|
||||||
// ==============
|
// ==============
|
||||||
import minimatch from 'minimatch';
|
|
||||||
const symbolTree = require('symbol-tree');
|
const symbolTree = require('symbol-tree');
|
||||||
|
|
||||||
export { minimatch, 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);
|
||||||
}
|
}
|
||||||
@ -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;
|
||||||
|
Reference in New Issue
Block a user