Compare commits
44 Commits
Author | SHA1 | Date | |
---|---|---|---|
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 |
4
.gitignore
vendored
4
.gitignore
vendored
@ -15,8 +15,6 @@ node_modules/
|
||||
|
||||
# builds
|
||||
dist/
|
||||
dist_web/
|
||||
dist_serve/
|
||||
dist_ts_web/
|
||||
dist_*/
|
||||
|
||||
# custom
|
@ -19,22 +19,36 @@ mirror:
|
||||
stage: security
|
||||
script:
|
||||
- npmci git mirror
|
||||
only:
|
||||
- tags
|
||||
tags:
|
||||
- lossless
|
||||
- docker
|
||||
- notpriv
|
||||
|
||||
snyk:
|
||||
image: registry.gitlab.com/hosttoday/ht-docker-node:snyk
|
||||
auditProductionDependencies:
|
||||
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
|
||||
stage: security
|
||||
script:
|
||||
- npmci npm prepare
|
||||
- npmci command npm install --production --ignore-scripts
|
||||
- npmci command npm config set registry https://registry.npmjs.org
|
||||
- npmci command npm audit --audit-level=high --only=prod --production
|
||||
tags:
|
||||
- docker
|
||||
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 snyk test
|
||||
- npmci command npm config set registry https://registry.npmjs.org
|
||||
- npmci command npm audit --audit-level=high --only=dev
|
||||
tags:
|
||||
- lossless
|
||||
- docker
|
||||
- notpriv
|
||||
allow_failure: true
|
||||
|
||||
# ====================
|
||||
# test stage
|
||||
@ -49,9 +63,7 @@ testStable:
|
||||
- npmci npm test
|
||||
coverage: /\d+.?\d+?\%\s*coverage/
|
||||
tags:
|
||||
- lossless
|
||||
- docker
|
||||
- priv
|
||||
|
||||
testBuild:
|
||||
stage: test
|
||||
@ -62,9 +74,7 @@ testBuild:
|
||||
- npmci command npm run build
|
||||
coverage: /\d+.?\d+?\%\s*coverage/
|
||||
tags:
|
||||
- lossless
|
||||
- docker
|
||||
- notpriv
|
||||
|
||||
release:
|
||||
stage: release
|
||||
@ -84,6 +94,8 @@ release:
|
||||
codequality:
|
||||
stage: metadata
|
||||
allow_failure: true
|
||||
only:
|
||||
- tags
|
||||
script:
|
||||
- npmci command npm install -g tslint typescript
|
||||
- npmci npm prepare
|
||||
|
2
.vscode/settings.json
vendored
2
.vscode/settings.json
vendored
@ -15,7 +15,7 @@
|
||||
"properties": {
|
||||
"projectType": {
|
||||
"type": "string",
|
||||
"enum": ["website", "element", "service", "npm"]
|
||||
"enum": ["website", "element", "service", "npm", "wcc"]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
26882
package-lock.json
generated
26882
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
40
package.json
40
package.json
@ -1,13 +1,13 @@
|
||||
{
|
||||
"name": "@pushrocks/lik",
|
||||
"version": "4.0.0",
|
||||
"version": "4.0.22",
|
||||
"private": false,
|
||||
"description": "light little helpers for node",
|
||||
"main": "dist/index.js",
|
||||
"typings": "dist/index.d.ts",
|
||||
"main": "dist_ts/index.js",
|
||||
"typings": "dist_ts/index.d.ts",
|
||||
"scripts": {
|
||||
"test": "(tstest test/)",
|
||||
"build": "(tsbuild)"
|
||||
"build": "(tsbuild --web && tsbundle npm)"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@ -20,33 +20,37 @@
|
||||
},
|
||||
"homepage": "https://gitlab.com/pushrocks/lik#README",
|
||||
"devDependencies": {
|
||||
"@gitzone/tsbuild": "^2.1.17",
|
||||
"@gitzone/tsrun": "^1.2.8",
|
||||
"@gitzone/tstest": "^1.0.28",
|
||||
"@pushrocks/tapbundle": "^3.2.0",
|
||||
"@types/node": "^13.7.0",
|
||||
"tslint": "^6.0.0",
|
||||
"@gitzone/tsbuild": "^2.1.27",
|
||||
"@gitzone/tsbundle": "^1.0.87",
|
||||
"@gitzone/tsrun": "^1.2.17",
|
||||
"@gitzone/tstest": "^1.0.57",
|
||||
"@pushrocks/tapbundle": "^3.2.14",
|
||||
"@types/node": "^16.9.1",
|
||||
"tslint": "^6.1.3",
|
||||
"tslint-config-prettier": "^1.18.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@pushrocks/smartdelay": "^2.0.6",
|
||||
"@pushrocks/smartpromise": "^3.0.6",
|
||||
"@pushrocks/smartrx": "^2.0.5",
|
||||
"@pushrocks/smarttime": "^3.0.12",
|
||||
"@pushrocks/smartunique": "^3.0.1",
|
||||
"@types/minimatch": "^3.0.3",
|
||||
"minimatch": "^3.0.4",
|
||||
"@pushrocks/smartdelay": "^2.0.13",
|
||||
"@pushrocks/smartmatch": "^1.0.7",
|
||||
"@pushrocks/smartpromise": "^3.1.6",
|
||||
"@pushrocks/smartrx": "^2.0.19",
|
||||
"@pushrocks/smarttime": "^3.0.38",
|
||||
"@types/minimatch": "^3.0.5",
|
||||
"symbol-tree": "^3.2.4"
|
||||
},
|
||||
"files": [
|
||||
"ts/**/*",
|
||||
"ts_web/**/*",
|
||||
"dist/**/*",
|
||||
"dist_web/**/*",
|
||||
"dist_*/**/*",
|
||||
"dist_ts/**/*",
|
||||
"dist_ts_web/**/*",
|
||||
"assets/**/*",
|
||||
"cli.js",
|
||||
"npmextra.json",
|
||||
"readme.md"
|
||||
],
|
||||
"browserslist": [
|
||||
"last 1 chrome versions"
|
||||
]
|
||||
}
|
||||
|
22
readme.md
22
readme.md
@ -8,13 +8,20 @@ light little helpers for node
|
||||
* [docs (typedoc)](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/@pushrocks/lik)
|
||||
[](https://snyk.io/test/npm/@pushrocks/lik)
|
||||
[](https://nodejs.org/dist/latest-v10.x/docs/api/)
|
||||
[](https://nodejs.org/dist/latest-v10.x/docs/api/)
|
||||
[](https://prettier.io/)
|
||||
|
||||
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
|
||||
|
||||
@ -35,7 +42,6 @@ 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.
|
||||
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). :)
|
||||
|
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).to.be.instanceOf(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).to.equal('heyho3');
|
||||
});
|
||||
|
||||
tap.start();
|
@ -4,7 +4,7 @@ import * as lik from '../ts/index';
|
||||
let testInterestmap: lik.InterestMap<number, number>;
|
||||
|
||||
tap.test('should create an interestmap', async () => {
|
||||
testInterestmap = new lik.InterestMap(numberArg => {
|
||||
testInterestmap = new lik.InterestMap((numberArg) => {
|
||||
return numberArg.toString();
|
||||
});
|
||||
});
|
@ -14,11 +14,11 @@ interface ITestObject {
|
||||
let testObjectmap: lik.ObjectMap<ITestObject>;
|
||||
let testObject1: ITestObject = {
|
||||
propOne: 'hello',
|
||||
propTwo: 'hello2'
|
||||
propTwo: 'hello2',
|
||||
};
|
||||
let testObject2: ITestObject = {
|
||||
propOne: 'hello',
|
||||
propTwo: 'hello2'
|
||||
propTwo: 'hello2',
|
||||
};
|
||||
|
||||
tap.test('new lik.Objectmap() -> should correctly instantiate an Objectmap', async () => {
|
||||
@ -44,7 +44,7 @@ tap.test('lik.Objectmap.remove() -> should correctly remove an object to Objectm
|
||||
});
|
||||
|
||||
tap.test('Objectmap.forEach -> should correctly run a function forEach map object', async () => {
|
||||
testObjectmap.forEach(itemArg => {
|
||||
testObjectmap.forEach((itemArg) => {
|
||||
expect(itemArg).to.have.property('propOne');
|
||||
});
|
||||
});
|
||||
@ -52,7 +52,7 @@ tap.test('Objectmap.forEach -> should correctly run a function forEach map objec
|
||||
tap.test('lik.Objectmap.find() -> should correctly find an object', async () => {
|
||||
let myObject = { propOne: 'helloThere', propTwo: 'helloAnyway' };
|
||||
testObjectmap.add(myObject);
|
||||
let referenceObject = testObjectmap.find(itemArg => {
|
||||
let referenceObject = testObjectmap.find((itemArg) => {
|
||||
return itemArg.propOne === 'helloThere';
|
||||
});
|
||||
// tslint:disable-next-line:no-unused-expression
|
@ -8,12 +8,12 @@ import * as lik from '../ts/index';
|
||||
|
||||
let testTimedAggregator: lik.TimedAggregtor<string>;
|
||||
|
||||
tap.test('should create a timed aggregaotor', async tools => {
|
||||
tap.test('should create a timed aggregaotor', async (tools) => {
|
||||
testTimedAggregator = new lik.TimedAggregtor<string>({
|
||||
aggregationIntervalInMillis: 1000,
|
||||
functionForAggregation: aggregation => {
|
||||
functionForAggregation: (aggregation) => {
|
||||
console.log(aggregation);
|
||||
}
|
||||
},
|
||||
});
|
||||
testTimedAggregator.add('This');
|
||||
testTimedAggregator.add('is a whole sentence.');
|
@ -1 +0,0 @@
|
||||
import './test.objectmap';
|
@ -1,5 +1,6 @@
|
||||
export * from './lik.fastmap';
|
||||
export * from './lik.interestmap';
|
||||
export * from './lik.interestmap.interest';
|
||||
export * from './lik.limitedarray';
|
||||
export * from './lik.looptracker';
|
||||
export * from './lik.objectmap';
|
||||
|
@ -29,7 +29,7 @@ export class FastMap<T> {
|
||||
return this.mapObject[keyArg];
|
||||
}
|
||||
|
||||
public removeFromMap(keyArg): T {
|
||||
public removeFromMap(keyArg: string): T {
|
||||
const removedItem = this.getByKey(keyArg);
|
||||
delete this.mapObject[keyArg];
|
||||
return removedItem;
|
||||
@ -50,7 +50,7 @@ export class FastMap<T> {
|
||||
}
|
||||
|
||||
/**
|
||||
* returns a new Objectmap that includes
|
||||
* 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>();
|
||||
@ -60,7 +60,7 @@ export class FastMap<T> {
|
||||
|
||||
for (const key of fastMapArg.getKeys()) {
|
||||
concatedFastmap.addToMap(key, fastMapArg.getByKey(key), {
|
||||
force: true
|
||||
force: true,
|
||||
});
|
||||
}
|
||||
|
||||
@ -68,15 +68,25 @@ export class FastMap<T> {
|
||||
}
|
||||
|
||||
/**
|
||||
* tries to merge another Objectmap
|
||||
* tries to merge another Fastmap
|
||||
* Note: uniqueKeyCollisions will cause overwrite
|
||||
* @param objectMapArg
|
||||
* @param fastMapArg
|
||||
*/
|
||||
public addAllFromOther(fastMapArg: FastMap<T>) {
|
||||
for (const key of fastMapArg.getKeys()) {
|
||||
this.addToMap(key, fastMapArg.getByKey(key), {
|
||||
force: true
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,7 +2,14 @@ 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>;
|
||||
@ -41,14 +48,20 @@ export class Interest<DTInterestId, DTInterestFullfillment> {
|
||||
constructor(
|
||||
interestMapArg: InterestMap<DTInterestId, DTInterestFullfillment>,
|
||||
interestArg: DTInterestId,
|
||||
comparisonFuncArg: IInterestComparisonFunc<DTInterestId>
|
||||
comparisonFuncArg: IInterestComparisonFunc<DTInterestId>,
|
||||
optionsArg?: IInterestOptions<DTInterestFullfillment>
|
||||
) {
|
||||
this.interestMapRef = interestMapArg;
|
||||
this.originalInterest = interestArg;
|
||||
this.comparisonFunc = comparisonFuncArg;
|
||||
this.interestMapRef = interestMapArg;
|
||||
this.options = optionsArg;
|
||||
|
||||
this.destructionTimer.completed.then(() => {
|
||||
this.destroy();
|
||||
});
|
||||
if (this.options?.markLostAfterDefault) {
|
||||
plugins.smartdelay.delayFor(this.options.markLostAfterDefault).then(this.markLost);
|
||||
}
|
||||
}
|
||||
|
||||
// ===============================
|
||||
@ -60,6 +73,9 @@ export class Interest<DTInterestId, DTInterestFullfillment> {
|
||||
*/
|
||||
public destroy() {
|
||||
this.interestMapRef.removeInterest(this);
|
||||
if (!this.isFullfilled && this.options.defaultFullfillment) {
|
||||
this.fullfillInterest(this.options.defaultFullfillment);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -7,7 +7,13 @@ 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
|
||||
*/
|
||||
@ -18,8 +24,12 @@ export class InterestMap<DTInterestId, DTInterestFullfillment> {
|
||||
*/
|
||||
private comparisonFunc: IInterestComparisonFunc<DTInterestId>;
|
||||
|
||||
constructor(comparisonFuncArg: IInterestComparisonFunc<DTInterestId>) {
|
||||
constructor(
|
||||
comparisonFuncArg: IInterestComparisonFunc<DTInterestId>,
|
||||
optionsArg: IInterestMapOptions = {}
|
||||
) {
|
||||
this.comparisonFunc = comparisonFuncArg;
|
||||
this.options = optionsArg;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -27,17 +37,22 @@ export class InterestMap<DTInterestId, DTInterestFullfillment> {
|
||||
* @param objectArg
|
||||
*/
|
||||
public async addInterest(
|
||||
objectArg: DTInterestId
|
||||
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
|
||||
this.comparisonFunc,
|
||||
{
|
||||
markLostAfterDefault: this.options.markLostAfterDefault,
|
||||
defaultFullfillment: defaultFullfillmentArg,
|
||||
}
|
||||
);
|
||||
let interestExists = false;
|
||||
await this.interestObjectMap.forEach(interestArg => {
|
||||
await this.interestObjectMap.forEach((interestArg) => {
|
||||
if (!interestExists && interestArg.comparisonString === newInterest.comparisonString) {
|
||||
console.log('info', `interest already exists for ${newInterest.comparisonString}`);
|
||||
interestExists = true;
|
||||
@ -61,7 +76,7 @@ export class InterestMap<DTInterestId, DTInterestFullfillment> {
|
||||
* @param objectArg removes an interest from the InterestMap
|
||||
*/
|
||||
public removeInterest(interestArg: Interest<DTInterestId, DTInterestFullfillment>) {
|
||||
const interestToRemove = this.interestObjectMap.findOneAndRemove(interestArg2 => {
|
||||
const interestToRemove = this.interestObjectMap.findOneAndRemove((interestArg2) => {
|
||||
return interestArg.comparisonString === interestArg2.comparisonString;
|
||||
});
|
||||
}
|
||||
@ -79,7 +94,7 @@ export class InterestMap<DTInterestId, DTInterestFullfillment> {
|
||||
* @param comparisonStringArg
|
||||
*/
|
||||
public checkInterestByString(comparisonStringArg: string): boolean {
|
||||
const foundInterest = this.interestObjectMap.find(interest => {
|
||||
const foundInterest = this.interestObjectMap.find((interest) => {
|
||||
return interest.comparisonString === comparisonStringArg;
|
||||
});
|
||||
if (foundInterest) {
|
||||
@ -106,7 +121,7 @@ export class InterestMap<DTInterestId, DTInterestFullfillment> {
|
||||
*/
|
||||
public findInterest(objectArg: DTInterestId): Interest<DTInterestId, DTInterestFullfillment> {
|
||||
const comparableString = this.comparisonFunc(objectArg);
|
||||
const interest = this.interestObjectMap.find(interestArg => {
|
||||
const interest = this.interestObjectMap.find((interestArg) => {
|
||||
return interestArg.comparisonString === comparableString;
|
||||
});
|
||||
return interest; // if an interest is found, the interest is returned, otherwise interest is null
|
||||
|
@ -1,6 +1,14 @@
|
||||
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> {
|
||||
(itemArg: T): void;
|
||||
}
|
||||
@ -9,6 +17,11 @@ export interface IObjectmapFindFunction<T> {
|
||||
(itemArg: T): boolean;
|
||||
}
|
||||
|
||||
export interface IObjectMapEventData<T> {
|
||||
operation: 'add' | 'remove';
|
||||
payload: T;
|
||||
}
|
||||
|
||||
/**
|
||||
* allows keeping track of objects
|
||||
*/
|
||||
@ -16,7 +29,7 @@ export class ObjectMap<T> {
|
||||
private fastMap = new FastMap<T>();
|
||||
|
||||
// events
|
||||
public eventSubject = new plugins.smartrx.rxjs.Subject<any>();
|
||||
public eventSubject = new plugins.smartrx.rxjs.Subject<IObjectMapEventData<T>>();
|
||||
|
||||
/**
|
||||
* returns a new instance
|
||||
@ -64,8 +77,12 @@ export class ObjectMap<T> {
|
||||
}
|
||||
|
||||
// otherwise lets create it
|
||||
const uniqueKey = plugins.smartunique.shortId();
|
||||
const uniqueKey = uni('key');
|
||||
this.addMappedUnique(uniqueKey, objectArg);
|
||||
this.eventSubject.next({
|
||||
operation: 'add',
|
||||
payload: objectArg
|
||||
});
|
||||
return uniqueKey;
|
||||
}
|
||||
|
||||
@ -142,7 +159,10 @@ export class ObjectMap<T> {
|
||||
} else {
|
||||
const keyToUse = keys[0];
|
||||
const removedItem = this.fastMap.removeFromMap(keyToUse);
|
||||
this.eventSubject.next('remove');
|
||||
this.eventSubject.next({
|
||||
operation: 'remove',
|
||||
payload: removedItem
|
||||
});
|
||||
return removedItem;
|
||||
}
|
||||
}
|
||||
@ -172,7 +192,10 @@ export class ObjectMap<T> {
|
||||
if (this.checkForObject(objectArg)) {
|
||||
const keyArg = this.getKeyForObject(objectArg);
|
||||
const removedObject = this.fastMap.removeFromMap(keyArg);
|
||||
this.eventSubject.next('remove');
|
||||
this.eventSubject.next({
|
||||
operation: 'remove',
|
||||
payload: removedObject
|
||||
});
|
||||
return removedObject;
|
||||
}
|
||||
return null;
|
||||
|
@ -1,26 +1,17 @@
|
||||
// ==============
|
||||
// native
|
||||
// ==============
|
||||
|
||||
import * as events from 'events';
|
||||
|
||||
export { events };
|
||||
|
||||
// ==============
|
||||
// @pushrocks
|
||||
// ==============
|
||||
import * as smartdelay from '@pushrocks/smartdelay';
|
||||
import * as smartmatch from '@pushrocks/smartmatch';
|
||||
import * as smartpromise from '@pushrocks/smartpromise';
|
||||
import * as smartrx from '@pushrocks/smartrx';
|
||||
import * as smarttime from '@pushrocks/smarttime';
|
||||
import * as smartunique from '@pushrocks/smartunique';
|
||||
|
||||
export { smartdelay, smartpromise, smartrx, smarttime, smartunique };
|
||||
export { smartdelay, smartmatch, smartpromise, smartrx, smarttime };
|
||||
|
||||
// ==============
|
||||
// third party
|
||||
// ==============
|
||||
import minimatch from 'minimatch';
|
||||
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
|
||||
*/
|
||||
|
||||
export interface ITriggerFunction {
|
||||
(): boolean;
|
||||
}
|
||||
export type TTriggerFunction = (stringArray?: string[]) => boolean;
|
||||
|
||||
export class Stringmap {
|
||||
private _stringArray: string[] = [];
|
||||
private _triggerUntilTrueFunctionArray: ITriggerFunction[] = [];
|
||||
private _triggerUntilTrueFunctionArray: TTriggerFunction[] = [];
|
||||
constructor() {}
|
||||
/**
|
||||
* add a string to the Stringmap
|
||||
@ -60,9 +58,10 @@ export class Stringmap {
|
||||
* checks stringPresence with minimatch
|
||||
*/
|
||||
public checkMinimatch(miniMatchStringArg: string): boolean {
|
||||
const smartMatchInstance = new plugins.smartmatch.SmartMatch(miniMatchStringArg);
|
||||
let foundMatch: boolean = false;
|
||||
for (const stringItem of this._stringArray) {
|
||||
if (plugins.minimatch(stringItem, miniMatchStringArg)) {
|
||||
if (smartMatchInstance.match(stringItem)) {
|
||||
foundMatch = true;
|
||||
}
|
||||
}
|
||||
@ -92,22 +91,27 @@ export class Stringmap {
|
||||
/**
|
||||
* register a new trigger
|
||||
*/
|
||||
public registerUntilTrue(functionArg: ITriggerFunction, doFunctionArg) {
|
||||
public registerUntilTrue(functionArg: TTriggerFunction, callbackArg?: () => any) {
|
||||
const trueDeferred = plugins.smartpromise.defer();
|
||||
this._triggerUntilTrueFunctionArray.push(() => {
|
||||
const result = functionArg();
|
||||
const result = functionArg(this.getStringArray());
|
||||
if (result === true) {
|
||||
doFunctionArg();
|
||||
if (callbackArg) {
|
||||
callbackArg();
|
||||
}
|
||||
trueDeferred.resolve();
|
||||
}
|
||||
return result;
|
||||
});
|
||||
this.notifyTrigger();
|
||||
return trueDeferred.promise;
|
||||
}
|
||||
|
||||
/**
|
||||
* notifies triggers
|
||||
*/
|
||||
private notifyTrigger() {
|
||||
const filteredArray = this._triggerUntilTrueFunctionArray.filter(functionArg => {
|
||||
const filteredArray = this._triggerUntilTrueFunctionArray.filter((functionArg) => {
|
||||
return !functionArg();
|
||||
});
|
||||
this._triggerUntilTrueFunctionArray = filteredArray;
|
||||
|
@ -62,15 +62,15 @@ export class Tree<T> {
|
||||
return this.symbolTree.ancestorsToArray(objectArg, optionsArg);
|
||||
}
|
||||
|
||||
treeToArray(rootArg, optionsArg: any): T[] {
|
||||
treeToArray(rootArg: T, optionsArg: any): T[] {
|
||||
return this.symbolTree.treeToArray(rootArg, optionsArg);
|
||||
}
|
||||
|
||||
childrenIterator(parentArg: T, optionsArg): T {
|
||||
childrenIterator(parentArg: T, optionsArg: any): T {
|
||||
return this.symbolTree.childrenIterator(parentArg, optionsArg);
|
||||
}
|
||||
|
||||
previousSiblingsIterator(objectArg): T {
|
||||
previousSiblingsIterator(objectArg: T): T {
|
||||
return this.symbolTree.previousSiblingsIterator(objectArg);
|
||||
}
|
||||
|
||||
@ -78,11 +78,11 @@ export class Tree<T> {
|
||||
return this.symbolTree.nextSiblingsIterator();
|
||||
}
|
||||
|
||||
ancestorsIterator(objectArg) {
|
||||
ancestorsIterator(objectArg: T) {
|
||||
this.symbolTree.ancestorsIterator();
|
||||
}
|
||||
|
||||
treeIterator(rootArg: T, optionsArg): Iterable<T> {
|
||||
treeIterator(rootArg: T, optionsArg: any): Iterable<T> {
|
||||
return this.symbolTree.treeIterator(rootArg);
|
||||
}
|
||||
|
||||
@ -114,7 +114,7 @@ export class Tree<T> {
|
||||
return this.symbolTree.prependChild(referenceObjectArg, newObjectArg);
|
||||
}
|
||||
|
||||
appendChild(referenceObjectArg, newObjectArg) {
|
||||
appendChild(referenceObjectArg: T, newObjectArg: T) {
|
||||
return this.symbolTree.appendChild(referenceObjectArg, newObjectArg);
|
||||
}
|
||||
|
||||
@ -126,7 +126,7 @@ export class Tree<T> {
|
||||
* returns a branch of the tree as JSON
|
||||
* can be user
|
||||
*/
|
||||
toJsonWithHierachy(rootElement) {
|
||||
toJsonWithHierachy(rootElement: T) {
|
||||
const treeIterable = this.treeIterator(rootElement, {});
|
||||
for (const treeItem of treeIterable) {
|
||||
console.log(treeItem);
|
||||
@ -137,5 +137,5 @@ export class Tree<T> {
|
||||
* builds a tree from a JSON with hierachy
|
||||
* @param rootElement
|
||||
*/
|
||||
fromJsonWithHierachy(rootElement) {}
|
||||
fromJsonWithHierachy(rootElement: T) {}
|
||||
}
|
||||
|
Reference in New Issue
Block a user