Compare commits

..

90 Commits

Author SHA1 Message Date
8d660a8573 3.0.14 2020-02-06 11:11:16 +00:00
596a897afc fix(core): update 2020-02-06 11:11:16 +00:00
e1442b1bc8 3.0.13 2019-11-27 23:15:14 +00:00
2ca9e14f76 fix(core): update 2019-11-27 23:15:13 +00:00
e65f36dfa2 3.0.12 2019-11-27 23:00:16 +00:00
adb95cd683 fix(dependencies): update 2019-11-27 23:00:15 +00:00
d2106690b4 3.0.11 2019-08-25 15:58:01 +02:00
2ea5111eb8 fix(core): update 2019-08-25 15:58:00 +02:00
aae10344fe 3.0.10 2019-08-02 16:57:45 +02:00
52b65d7dc3 3.0.9 2019-08-02 16:48:30 +02:00
1135b418cb 3.0.8 2019-08-02 16:38:09 +02:00
2eb1dbd0b3 fix(core): update 2019-08-02 16:38:08 +02:00
8ec54c17a1 3.0.7 2019-08-02 16:33:46 +02:00
500a291b2a fix(core): update 2019-08-02 16:33:45 +02:00
256a14fcb0 3.0.6 2019-08-02 16:32:52 +02:00
7aa0f05bae fix(core): update 2019-08-02 16:32:52 +02:00
6208cab36a 3.0.5 2019-03-15 23:50:40 +01:00
50a9697baf fix(objectmap): getArray() now has correct return type 2019-03-15 23:50:39 +01:00
7956cf6ace 3.0.4 2018-12-11 01:41:05 +01:00
d8956d4e32 fix(ci): remove old build dependencies 2018-12-11 01:41:05 +01:00
c93a67c351 3.0.3 2018-12-11 01:36:15 +01:00
fafd9867ad fix(core): update 2018-12-11 01:36:14 +01:00
2dfa96bbc5 3.0.2 2018-11-23 20:33:45 +01:00
a7484e791a fix(core): update 2018-11-23 20:33:44 +01:00
2dba68df8c Merge branch 'master' into 'master'
implement JSON methods for tree

See merge request pushrocks/lik!1
2018-09-01 14:38:56 +00:00
6aff4c9031 implement JSON methods for tree 2018-08-31 17:24:35 +02:00
e81e0ebd41 3.0.1 2018-07-15 16:08:21 +02:00
18866b9a05 fix(ci): fix build tool packagename 2018-07-15 16:08:20 +02:00
71b12b2d9c 3.0.0 2018-07-15 16:06:08 +02:00
0669fc3779 2.0.7 2018-07-15 16:05:42 +02:00
7021f8f1ae 2.0.6 2018-07-15 16:04:48 +02:00
2392915959 update to latest standards 2018-07-15 16:04:27 +02:00
b8100f8dfc 2.0.5 2018-01-27 18:16:39 +01:00
04e9d8be77 docs(add snyk badge): 2018-01-27 18:16:33 +01:00
a9715381c1 2.0.4 2018-01-27 18:13:07 +01:00
c2f081d69a fix(security): improve security CI step 2018-01-27 18:13:03 +01:00
b98f075cbd 2.0.3 2018-01-27 18:11:16 +01:00
5ff74aea88 feat(core): update to newest gitzone package format 2018-01-27 18:11:11 +01:00
a6eaf78c80 2.0.2 2017-11-20 09:26:16 +01:00
adda1c932a add Tree class 2017-11-20 09:26:13 +01:00
7c8643b090 2.0.1 2017-10-30 08:23:32 +01:00
9e81960095 update readme 2017-10-30 08:23:28 +01:00
a76832bedb 2.0.0 2017-10-26 22:31:21 +02:00
3c229e8e26 remove rxjs and move Observablemap to smartrx 2017-10-26 22:31:14 +02:00
29d6f2d7e0 1.0.43 2017-10-24 13:19:54 +02:00
2b5ff6a4ab remove q dependency 2017-10-24 13:19:52 +02:00
c75437e73f 1.0.42 2017-09-21 23:03:41 +02:00
61e4a62689 update ci 2017-09-21 23:03:36 +02:00
d53f5410cd 1.0.41 2017-09-21 23:01:07 +02:00
53516b1c8f update dependencies 2017-09-21 23:01:03 +02:00
e59205490b add LimitedArray 2017-09-21 22:54:22 +02:00
38884ff59c 1.0.40 2017-08-27 20:18:19 +02:00
861833e930 update docs 2017-08-27 20:18:15 +02:00
1274840d17 1.0.39 2017-08-27 20:01:10 +02:00
d2ce1094de improve objectmap.forEach to support async actions 2017-08-27 20:01:06 +02:00
6b3fcff971 1.0.38 2017-07-05 14:37:30 +02:00
011a865271 improve tests 2017-07-05 14:37:26 +02:00
78914e54b3 1.0.37 2017-07-05 14:29:46 +02:00
281cfdc38a add loop tracker 2017-07-05 14:29:08 +02:00
217252de1e 1.0.36 2017-06-30 18:01:38 +02:00
ab7f7230ef fix rxjs wring typings 2017-06-30 18:01:35 +02:00
7f03ae5248 1.0.35 2017-06-30 17:20:00 +02:00
0060ec2971 update dependencies 2017-06-30 17:19:58 +02:00
eec89a596a 1.0.34 2017-06-30 17:14:59 +02:00
d34a91d283 1.0.33 2017-06-30 17:11:51 +02:00
db14306bcf remove tapbundle from dependencies 2017-06-30 17:11:47 +02:00
cf446f90ee 1.0.32 2017-06-18 13:13:16 +02:00
9c2f3cf678 update typings 2017-06-18 13:13:12 +02:00
18df32ae5a 1.0.31 2017-06-17 14:45:26 +02:00
66b6e78bb1 update ci 2017-06-17 14:45:23 +02:00
408faa97a4 update tests 2017-06-17 14:44:55 +02:00
4a7749be47 1.0.30 2017-04-09 16:40:37 +02:00
570283551f update README 2017-04-09 16:40:34 +02:00
c6c5c5ea40 1.0.29 2017-04-09 16:33:35 +02:00
ddd071ccb6 update ci 2017-04-09 16:33:32 +02:00
8b9c87d381 1.0.28 2017-04-09 16:29:18 +02:00
89ea1fdb18 update deps 2017-04-09 16:29:14 +02:00
5b2aea7626 1.0.27 2016-11-19 23:54:55 +01:00
cfbc47e365 add lik.Objectmap.isEmpty() 2016-11-19 23:54:52 +01:00
bb3b02ed74 1.0.26 2016-11-19 23:15:46 +01:00
bb4820e980 improve typings 2016-11-19 23:15:43 +01:00
fa17a998f1 1.0.25 2016-11-19 23:08:58 +01:00
afad357ed0 add getOneAndRemove and findOneAndRemove 2016-11-19 23:08:54 +01:00
59173eebc4 1.0.24 2016-10-03 13:48:37 +02:00
515571dcb3 added missing dep 2016-10-03 13:48:34 +02:00
177ed2d03d 1.0.23 2016-09-29 22:14:54 +02:00
23ecaddd5a 1.0.22 2016-09-29 22:05:25 +02:00
924058c90a add new method Objectmap.getArray() 2016-09-29 22:05:20 +02:00
30e23a77b7 1.0.21 2016-09-23 10:20:32 +02:00
b228c3b2f0 improve README 2016-09-23 10:20:20 +02:00
42 changed files with 3198 additions and 829 deletions

25
.gitignore vendored
View File

@ -1,5 +1,22 @@
node_modules/ .nogit/
pages/
public/ # artifacts
coverage/ coverage/
.nogit/ public/
pages/
# installs
node_modules/
# caches
.yarn/
.cache/
.rpt2_cache
# builds
dist/
dist_web/
dist_serve/
dist_ts_web/
# custom

View File

@ -1,49 +1,126 @@
image: hosttoday/ht-docker-node:npmts # gitzone ci_default
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
cache:
paths:
- .npmci_cache/
key: '$CI_BUILD_STAGE'
stages: stages:
- test - security
- release - test
- page - release
- metadata
testLEGACY: # ====================
stage: test # security stage
# ====================
mirror:
stage: security
script: script:
- npmci test legacy - npmci git mirror
tags: tags:
- lossless
- docker - docker
- notpriv
testLTS: snyk:
image: registry.gitlab.com/hosttoday/ht-docker-node:snyk
stage: security
script:
- npmci npm prepare
- npmci command npm install --ignore-scripts
- npmci command snyk test
tags:
- lossless
- docker
- notpriv
# ====================
# test stage
# ====================
testStable:
stage: test stage: test
script: script:
- npmci test lts - npmci npm prepare
- npmci node install stable
- npmci npm install
- npmci npm test
coverage: /\d+.?\d+?\%\s*coverage/
tags: tags:
- lossless
- docker - docker
- priv
testSTABLE:
testBuild:
stage: test stage: test
script: script:
- npmci test stable - npmci npm prepare
- npmci node install stable
- npmci npm install
- npmci command npm run build
coverage: /\d+.?\d+?\%\s*coverage/
tags: tags:
- lossless
- docker - docker
- notpriv
release: release:
stage: release stage: release
environment: npmjs-com_registry
script: script:
- npmci publish - npmci node install stable
- npmci npm publish
only: only:
- tags - tags
tags: tags:
- lossless
- docker - docker
- notpriv
# ====================
# metadata stage
# ====================
codequality:
stage: metadata
allow_failure: true
script:
- npmci command npm install -g tslint typescript
- npmci npm prepare
- npmci npm install
- npmci command "tslint -c tslint.json ./ts/**/*.ts"
tags:
- lossless
- docker
- priv
trigger:
stage: metadata
script:
- npmci trigger
only:
- tags
tags:
- lossless
- docker
- notpriv
pages: pages:
image: hosttoday/ht-docker-node:npmpage stage: metadata
stage: page
script: script:
- npmci command npmpage --host gitlab - npmci node install lts
- npmci command npm install -g @gitzone/tsdoc
- npmci npm prepare
- npmci npm install
- npmci command tsdoc
tags:
- lossless
- docker
- notpriv
only: only:
- tags - tags
artifacts: artifacts:
expire_in: 1 week expire_in: 1 week
paths: paths:
- public - public
allow_failure: true

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

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

26
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,26 @@
{
"json.schemas": [
{
"fileMatch": ["/npmextra.json"],
"schema": {
"type": "object",
"properties": {
"npmci": {
"type": "object",
"description": "settings for npmci"
},
"gitzone": {
"type": "object",
"description": "settings for gitzone",
"properties": {
"projectType": {
"type": "string",
"enum": ["website", "element", "service", "npm"]
}
}
}
}
}
}
]
}

View File

@ -1,28 +0,0 @@
# lik
light little helpers for node
## Availabililty
[![npm](https://push.rocks/assets/repo-button-npm.svg)](https://www.npmjs.com/package/lik)
[![git](https://push.rocks/assets/repo-button-git.svg)](https://gitlab.com/pushrocks/lik)
[![git](https://push.rocks/assets/repo-button-mirror.svg)](https://github.com/pushrocks/lik)
[![docs](https://push.rocks/assets/repo-button-docs.svg)](https://pushrocks.gitlab.io/lik/gitbook)
## Status for master
[![build status](https://gitlab.com/pushrocks/lik/badges/master/build.svg)](https://gitlab.com/pushrocks/lik/commits/master)
[![coverage report](https://gitlab.com/pushrocks/lik/badges/master/coverage.svg)](https://gitlab.com/pushrocks/lik/commits/master)
[![Dependency Status](https://david-dm.org/pushrocks/lik.svg)](https://david-dm.org/pushrocks/lik)
[![bitHound Dependencies](https://www.bithound.io/github/pushrocks/lik/badges/dependencies.svg)](https://www.bithound.io/github/pushrocks/lik/master/dependencies/npm)
[![bitHound Code](https://www.bithound.io/github/pushrocks/lik/badges/code.svg)](https://www.bithound.io/github/pushrocks/lik)
[![TypeScript](https://img.shields.io/badge/TypeScript-2.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/)
[![node](https://img.shields.io/badge/node->=%206.x.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/)
[![JavaScript Style Guide](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](http://standardjs.com/)
## Usage
We recommend the use of TypeScript for good intellisense.
```typescript
// import any tool that you need from lik
import { Stringmap, Objectmap } from "lik";
```
For a class overview, please read the docs

3
dist/index.d.ts vendored
View File

@ -1,3 +0,0 @@
export * from './lik.stringmap';
export * from './lik.objectmap';
export * from './lik.observablemap';

9
dist/index.js vendored
View File

@ -1,9 +0,0 @@
"use strict";
function __export(m) {
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
}
// import modules
__export(require("./lik.stringmap"));
__export(require("./lik.objectmap"));
__export(require("./lik.observablemap"));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBRUEsaUJBQWlCO0FBRWpCLHFDQUErQjtBQUMvQixxQ0FBK0I7QUFDL0IseUNBQW1DIn0=

View File

@ -1,44 +0,0 @@
export interface IObjectmapForEachFunction<T> {
(itemArg: T): void;
}
export interface IObjectmapFindFunction<T> {
(itemArg: T): boolean;
}
/**
* allows keeping track of objects
*/
export declare class Objectmap<T> {
private objectArray;
/**
* returns a new instance
*/
constructor();
/**
* add object to Objectmap
*/
add(objectArg: T): void;
/**
* like .add but adds an whole array of objects
*/
addArray(objectArrayArg: T[]): void;
/**
* remove object from Objectmap
*/
remove(objectArg: T): void;
/**
* check if object is in Objectmap
*/
checkForObject(objectArg: T): boolean;
/**
* find object
*/
find(findFunction: IObjectmapFindFunction<T>): T;
/**
* run function for each item in Objectmap
*/
forEach(functionArg: IObjectmapForEachFunction<T>): void;
/**
* wipe Objectmap
*/
wipe(): void;
}

70
dist/lik.objectmap.js vendored
View File

@ -1,70 +0,0 @@
"use strict";
/**
* allows keeping track of objects
*/
class Objectmap {
/**
* returns a new instance
*/
constructor() {
this.objectArray = [];
}
/**
* add object to Objectmap
*/
add(objectArg) {
this.objectArray.push(objectArg);
}
/**
* like .add but adds an whole array of objects
*/
addArray(objectArrayArg) {
for (let item of objectArrayArg) {
this.add(item);
}
}
/**
* remove object from Objectmap
*/
remove(objectArg) {
let replacmentArray = [];
for (let item of this.objectArray) {
if (item !== objectArg) {
replacmentArray.push(item);
}
}
this.objectArray = replacmentArray;
}
/**
* check if object is in Objectmap
*/
checkForObject(objectArg) {
return this.objectArray.indexOf(objectArg) !== -1;
}
/**
* find object
*/
find(findFunction) {
let resultArray = this.objectArray.filter(findFunction);
if (resultArray.length > 0) {
return resultArray[0];
}
else {
return null;
}
}
/**
* run function for each item in Objectmap
*/
forEach(functionArg) {
return this.objectArray.forEach(functionArg);
}
/**
* wipe Objectmap
*/
wipe() {
this.objectArray = [];
}
}
exports.Objectmap = Objectmap;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlrLm9iamVjdG1hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2xpay5vYmplY3RtYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQVVBOztHQUVHO0FBQ0g7SUFHSTs7T0FFRztJQUNIO1FBTFEsZ0JBQVcsR0FBUSxFQUFFLENBQUE7SUFPN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsR0FBRyxDQUFDLFNBQVk7UUFDWixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUNwQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRLENBQUMsY0FBbUI7UUFDeEIsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2xCLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsU0FBWTtRQUNmLElBQUksZUFBZSxHQUFHLEVBQUUsQ0FBQTtRQUN4QixHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNoQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDckIsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUM5QixDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsZUFBZSxDQUFBO0lBQ3RDLENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWMsQ0FBQyxTQUFZO1FBQ3ZCLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUNyRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLENBQUMsWUFBdUM7UUFDeEMsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDdkQsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDekIsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0osTUFBTSxDQUFDLElBQUksQ0FBQTtRQUNmLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxPQUFPLENBQUMsV0FBeUM7UUFDN0MsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQ2hELENBQUM7SUFFRDs7T0FFRztJQUNILElBQUk7UUFDQSxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQTtJQUN6QixDQUFDO0NBQ0o7QUF2RUQsOEJBdUVDIn0=

View File

@ -1,16 +0,0 @@
/// <reference types="node" />
import * as plugins from './lik.plugins';
import { Objectmap } from './lik.objectmap';
import { Observable } from 'rxjs/Rx';
/**
* bundles an observable with an emitter
*/
export interface ObservableEmitterBundle {
observable: plugins.rx.Observable<any>;
emitter: plugins.events.EventEmitter;
event: string;
}
export declare class Observablemap {
ObservableEmitterBundleObjectmap: Objectmap<ObservableEmitterBundle>;
getObservableForEmitterEvent(emitterArg: plugins.events.EventEmitter, eventArg: string): Observable<any>;
}

View File

@ -1,27 +0,0 @@
"use strict";
const plugins = require("./lik.plugins");
const lik_objectmap_1 = require("./lik.objectmap");
class Observablemap {
constructor() {
this.ObservableEmitterBundleObjectmap = new lik_objectmap_1.Objectmap();
}
getObservableForEmitterEvent(emitterArg, eventArg) {
let existingBundle = this.ObservableEmitterBundleObjectmap.find((bundleArg) => {
return (bundleArg.emitter === emitterArg && bundleArg.event === eventArg);
});
if (existingBundle) {
return existingBundle.observable;
}
else {
let emitterObservable = plugins.rx.Observable.fromEvent(emitterArg, eventArg);
this.ObservableEmitterBundleObjectmap.add({
observable: emitterObservable,
emitter: emitterArg,
event: eventArg
});
return emitterObservable;
}
}
}
exports.Observablemap = Observablemap;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlrLm9ic2VydmFibGVtYXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9saWsub2JzZXJ2YWJsZW1hcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEseUNBQXdDO0FBQ3hDLG1EQUEyQztBQWMzQztJQUFBO1FBQ0kscUNBQWdDLEdBQUcsSUFBSSx5QkFBUyxFQUEyQixDQUFBO0lBa0IvRSxDQUFDO0lBaEJHLDRCQUE0QixDQUFDLFVBQXVDLEVBQUUsUUFBZ0I7UUFDbEYsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVM7WUFDdEUsTUFBTSxDQUFBLENBQUMsU0FBUyxDQUFDLE9BQU8sS0FBSyxVQUFVLElBQUksU0FBUyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQTtRQUM1RSxDQUFDLENBQUMsQ0FBQTtRQUNGLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7WUFDakIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUE7UUFDcEMsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0osSUFBSSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1lBQzdFLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxHQUFHLENBQUM7Z0JBQ3RDLFVBQVUsRUFBRSxpQkFBaUI7Z0JBQzdCLE9BQU8sRUFBRSxVQUFVO2dCQUNuQixLQUFLLEVBQUUsUUFBUTthQUNsQixDQUFDLENBQUE7WUFDRixNQUFNLENBQUMsaUJBQWlCLENBQUE7UUFDNUIsQ0FBQztJQUNMLENBQUM7Q0FDSjtBQW5CRCxzQ0FtQkMifQ==

View File

@ -1,6 +0,0 @@
import 'typings-global';
export import q = require('q');
export import events = require('events');
export import lodash = require('lodash');
export import minimatch = require('minimatch');
export import rx = require('rxjs/Rx');

8
dist/lik.plugins.js vendored
View File

@ -1,8 +0,0 @@
"use strict";
require("typings-global");
exports.q = require("q");
exports.events = require("events");
exports.lodash = require("lodash");
exports.minimatch = require("minimatch");
exports.rx = require("rxjs/Rx");
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlrLnBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9saWsucGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMEJBQXVCO0FBQ3ZCLHlCQUE4QjtBQUM5QixtQ0FBd0M7QUFDeEMsbUNBQXdDO0FBQ3hDLHlDQUE4QztBQUM5QyxnQ0FBcUMifQ==

View File

@ -1,51 +0,0 @@
/**
* allows you to easily keep track of a bunch of strings
*/
export interface ITriggerFunction {
(): boolean;
}
export declare class Stringmap {
private _stringArray;
private _triggerUntilTrueFunctionArray;
constructor();
/**
* add a string to the Stringmap
*/
addString(stringArg: string): void;
/**
* like addString, but accepts an array of strings
*/
addStringArray(stringArrayArg: string[]): void;
/**
* removes a string from Stringmap
*/
removeString(stringArg: string): void;
/**
* wipes the Stringmap
*/
wipe(): void;
/**
* check if string is in Stringmap
*/
checkString(stringArg: string): boolean;
/**
* checks stringPresence with minimatch
*/
checkMinimatch(miniMatchStringArg: string): boolean;
/**
* checks if the Stringmap is empty
*/
checkIsEmpty(): boolean;
/**
* gets a cloned copy of the current string Array
*/
getStringArray(): string[];
/**
* register a new trigger
*/
registerUntilTrue(functionArg: ITriggerFunction, doFunctionArg: any): void;
/**
* notifies triggers
*/
private notifyTrigger();
}

96
dist/lik.stringmap.js vendored
View File

@ -1,96 +0,0 @@
"use strict";
const plugins = require("./lik.plugins");
class Stringmap {
constructor() {
this._stringArray = [];
this._triggerUntilTrueFunctionArray = [];
}
/**
* add a string to the Stringmap
*/
addString(stringArg) {
this._stringArray.push(stringArg);
this.notifyTrigger();
}
/**
* like addString, but accepts an array of strings
*/
addStringArray(stringArrayArg) {
for (let stringItem of stringArrayArg) {
this.addString(stringItem);
}
}
/**
* removes a string from Stringmap
*/
removeString(stringArg) {
for (let keyArg in this._stringArray) {
if (this._stringArray[keyArg] === stringArg) {
this._stringArray.splice(parseInt(keyArg), 1);
}
}
this.notifyTrigger();
}
/**
* wipes the Stringmap
*/
wipe() {
this._stringArray = [];
this.notifyTrigger();
}
/**
* check if string is in Stringmap
*/
checkString(stringArg) {
return this._stringArray.indexOf(stringArg) !== -1;
}
/**
* checks stringPresence with minimatch
*/
checkMinimatch(miniMatchStringArg) {
let foundMatch = false;
for (let stringItem of this._stringArray) {
if (plugins.minimatch(stringItem, miniMatchStringArg)) {
foundMatch = true;
}
}
return foundMatch;
}
/**
* checks if the Stringmap is empty
*/
checkIsEmpty() {
return (this._stringArray.length === 0);
}
/**
* gets a cloned copy of the current string Array
*/
getStringArray() {
return plugins.lodash.cloneDeep(this._stringArray);
}
// trigger registering
/**
* register a new trigger
*/
registerUntilTrue(functionArg, doFunctionArg) {
this._triggerUntilTrueFunctionArray.push(() => {
let result = functionArg();
if (result === true) {
doFunctionArg();
}
return result;
});
this.notifyTrigger();
}
/**
* notifies triggers
*/
notifyTrigger() {
let filteredArray = this._triggerUntilTrueFunctionArray.filter((functionArg) => {
return !functionArg();
});
this._triggerUntilTrueFunctionArray = filteredArray;
}
}
exports.Stringmap = Stringmap;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlrLnN0cmluZ21hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2xpay5zdHJpbmdtYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHlDQUF3QztBQVV4QztJQUdJO1FBRlEsaUJBQVksR0FBYSxFQUFFLENBQUE7UUFDM0IsbUNBQThCLEdBQXVCLEVBQUUsQ0FBQTtJQUNoRCxDQUFDO0lBQ2hCOztPQUVHO0lBQ0gsU0FBUyxDQUFDLFNBQWlCO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ2pDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtJQUN4QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjLENBQUMsY0FBd0I7UUFDbkMsR0FBRyxDQUFDLENBQUMsSUFBSSxVQUFVLElBQUksY0FBYyxDQUFDLENBQUEsQ0FBQztZQUNuQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzlCLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZLENBQUMsU0FBaUI7UUFDMUIsR0FBRyxDQUFDLENBQUMsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDbkMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUE7WUFDaEQsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUE7SUFDeEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSTtRQUNBLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFBO1FBQ3RCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtJQUN4QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXLENBQUMsU0FBaUI7UUFDekIsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBQ3RELENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWMsQ0FBQyxrQkFBMEI7UUFDckMsSUFBSSxVQUFVLEdBQVksS0FBSyxDQUFBO1FBQy9CLEdBQUcsQ0FBQyxDQUFDLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQSxDQUFDO1lBQ3RDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuRCxVQUFVLEdBQUcsSUFBSSxDQUFBO1lBQ3JCLENBQUM7UUFDTCxDQUFDO1FBQ0QsTUFBTSxDQUFDLFVBQVUsQ0FBQTtJQUNyQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZO1FBQ1IsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYztRQUNWLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7SUFDdEQsQ0FBQztJQUVELHNCQUFzQjtJQUV0Qjs7T0FFRztJQUNILGlCQUFpQixDQUFDLFdBQTZCLEVBQUMsYUFBYTtRQUN6RCxJQUFJLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUNwQztZQUNJLElBQUksTUFBTSxHQUFHLFdBQVcsRUFBRSxDQUFBO1lBQzFCLEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNsQixhQUFhLEVBQUUsQ0FBQTtZQUNuQixDQUFDO1lBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQTtRQUNqQixDQUFDLENBQ0osQ0FBQTtRQUNELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtJQUN4QixDQUFDO0lBRUQ7O09BRUc7SUFDSyxhQUFhO1FBQ2pCLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXO1lBQ3ZFLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQ3pCLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLDhCQUE4QixHQUFHLGFBQWEsQ0FBQTtJQUN2RCxDQUFDO0NBRUo7QUF2R0QsOEJBdUdDIn0=

46
docs/index.md Normal file
View File

@ -0,0 +1,46 @@
# lik
light little helpers for node
## Availabililty
[![npm](https://pushrocks.gitlab.io/assets/repo-button-npm.svg)](https://www.npmjs.com/package/lik)
[![git](https://pushrocks.gitlab.io/assets/repo-button-git.svg)](https://GitLab.com/pushrocks/lik)
[![git](https://pushrocks.gitlab.io/assets/repo-button-mirror.svg)](https://github.com/pushrocks/lik)
[![docs](https://pushrocks.gitlab.io/assets/repo-button-docs.svg)](https://pushrocks.gitlab.io/lik/)
## Status for master
[![build status](https://GitLab.com/pushrocks/lik/badges/master/build.svg)](https://GitLab.com/pushrocks/lik/commits/master)
[![coverage report](https://GitLab.com/pushrocks/lik/badges/master/coverage.svg)](https://GitLab.com/pushrocks/lik/commits/master)
[![npm downloads per month](https://img.shields.io/npm/dm/lik.svg)](https://www.npmjs.com/package/lik)
[![Dependency Status](https://david-dm.org/pushrocks/lik.svg)](https://david-dm.org/pushrocks/lik)
[![bitHound Dependencies](https://www.bithound.io/github/pushrocks/lik/badges/dependencies.svg)](https://www.bithound.io/github/pushrocks/lik/master/dependencies/npm)
[![bitHound Code](https://www.bithound.io/github/pushrocks/lik/badges/code.svg)](https://www.bithound.io/github/pushrocks/lik)
[![TypeScript](https://img.shields.io/badge/TypeScript-2.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/)
[![node](https://img.shields.io/badge/node->=%206.x.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/)
[![JavaScript Style Guide](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](http://standardjs.com/)
## Usage
Use TypeScript for best in class instellisense.
```javascript
// import any tool that you need from lik
import { Stringmap, Objectmap, Observablemap } from 'lik';
```
### class Stringmap
Stringmap allows you to keep track of strings. It allows you to register triggers for certain events
like when a certain string is removed or added to the map
### class Objectmap
Sometimes you need to keep track of objects, but implementing logic for removing, finding or updating is tedious.
Objectmap takes care of keeping track of objects for you.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
> | By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
[![repo-footer](https://pushrocks.gitlab.io/assets/repo-footer.svg)](https://push.rocks)

17
npmextra.json Normal file
View File

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

1905
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,11 +1,13 @@
{ {
"name": "lik", "name": "@pushrocks/lik",
"version": "1.0.20", "version": "3.0.14",
"private": false,
"description": "light little helpers for node", "description": "light little helpers for node",
"main": "dist/index.js", "main": "dist/index.js",
"typings": "dist/index.d.ts", "typings": "dist/index.d.ts",
"scripts": { "scripts": {
"test": "(npmts)" "test": "(tstest test/)",
"build": "(tsbuild)"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@ -18,18 +20,32 @@
}, },
"homepage": "https://gitlab.com/pushrocks/lik#README", "homepage": "https://gitlab.com/pushrocks/lik#README",
"devDependencies": { "devDependencies": {
"@types/should": "^8.1.30", "@gitzone/tsbuild": "^2.1.17",
"npmts-g": "^5.2.8", "@gitzone/tsrun": "^1.2.8",
"should": "^11.1.0", "@gitzone/tstest": "^1.0.28",
"typings-test": "^1.0.3" "@pushrocks/tapbundle": "^3.2.0",
"@types/node": "^13.7.0",
"tslint": "^6.0.0",
"tslint-config-prettier": "^1.18.0"
}, },
"dependencies": { "dependencies": {
"@types/lodash": "^4.14.35", "@pushrocks/smartdelay": "^2.0.6",
"@types/minimatch": "2.x.x", "@pushrocks/smartpromise": "^3.0.6",
"@types/q": "0.x.x", "@pushrocks/smartrx": "^2.0.5",
"lodash": "^4.16.1", "@pushrocks/smarttime": "^3.0.12",
"minimatch": "^3.0.3", "@types/minimatch": "^3.0.3",
"q": "^1.4.1", "minimatch": "^3.0.4",
"rxjs": "^5.0.0-beta.12" "symbol-tree": "^3.2.4"
} },
"files": [
"ts/**/*",
"ts_web/**/*",
"dist/**/*",
"dist_web/**/*",
"dist_ts_web/**/*",
"assets/**/*",
"cli.js",
"npmextra.json",
"readme.md"
]
} }

1
test/test.d.ts vendored
View File

@ -1 +0,0 @@
import 'typings-test';

25
test/test.interestmap.ts Normal file
View 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();

File diff suppressed because one or more lines are too long

17
test/test.limitedarray.ts Normal file
View File

@ -0,0 +1,17 @@
import { tap, expect } from '@pushrocks/tapbundle';
import { LimitedArray } from '../ts/index';
let testLimitedArray: LimitedArray<string>;
tap.test('should create a LimitedArray', async () => {
testLimitedArray = new LimitedArray(6);
expect(testLimitedArray).to.be.instanceof(LimitedArray);
});
tap.test('should never be longer than the set length', async () => {
testLimitedArray.addMany(['hi', 'this', 'is', 'quite', 'a', 'long', 'string', ':)']);
expect(testLimitedArray.array.length).to.be.lessThan(7);
});
tap.start();

26
test/test.looptracker.ts Normal file
View File

@ -0,0 +1,26 @@
// import test framework
import { expect, tap } from '@pushrocks/tapbundle';
import * as events from 'events';
import * as smartpromise from '@pushrocks/smartpromise';
// import the module
import * as lik from '../ts/index';
let object1 = {};
let object2 = {};
let myLoopTracker: lik.LoopTracker<any>;
// tests
tap.test('should create a valid looptracker instance', async () => {
myLoopTracker = new lik.LoopTracker();
expect(myLoopTracker).to.be.instanceof(lik.LoopTracker);
});
tap.test('should add objects once and return true', async () => {
expect(myLoopTracker.checkAndTrack(object1)).to.be.true;
expect(myLoopTracker.checkAndTrack(object1)).to.be.false;
expect(myLoopTracker.checkAndTrack(object2)).to.be.true;
expect(myLoopTracker.checkAndTrack(object2)).to.be.false;
});
tap.start();

78
test/test.objectmap.ts Normal file
View File

@ -0,0 +1,78 @@
// 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';
// Objectmap
interface ITestObject {
propOne: string;
propTwo: string;
}
let testObjectmap: lik.Objectmap<ITestObject>;
let testObject1: ITestObject = {
propOne: 'hello',
propTwo: 'hello2'
};
let testObject2: ITestObject = {
propOne: 'hello',
propTwo: 'hello2'
};
tap.test('new lik.Objectmap() -> should correctly instantiate an Objectmap', async () => {
testObjectmap = new lik.Objectmap<ITestObject>();
expect(testObjectmap).be.instanceof(lik.Objectmap);
});
tap.test('lik.Objectmap.add() -> should correctly add an object to Objectmap', async () => {
testObjectmap.add(testObject1);
// tslint:disable-next-line:no-unused-expression
expect(testObjectmap.checkForObject(testObject1)).be.true;
// tslint:disable-next-line:no-unused-expression
expect(testObjectmap.checkForObject(testObject2)).be.false;
});
tap.test('lik.Objectmap.remove() -> should correctly remove an object to Objectmap', async () => {
testObjectmap.add(testObject2);
testObjectmap.remove(testObject1);
// tslint:disable-next-line:no-unused-expression
expect(testObjectmap.checkForObject(testObject1)).be.false;
// tslint:disable-next-line:no-unused-expression
expect(testObjectmap.checkForObject(testObject2)).be.true;
});
tap.test('Objectmap.forEach -> should correctly run a function forEach map object', async () => {
testObjectmap.forEach(itemArg => {
expect(itemArg).to.have.property('propOne');
});
});
tap.test('lik.Objectmap.find() -> should correctly find an object', async () => {
let myObject = { propOne: 'helloThere', propTwo: 'helloAnyway' };
testObjectmap.add(myObject);
let referenceObject = testObjectmap.find(itemArg => {
return itemArg.propOne === 'helloThere';
});
// tslint:disable-next-line:no-unused-expression
expect(myObject === referenceObject).be.true;
});
tap.test('lik.Objectmap.getArray() -> should return a cloned array', async () => {
let myObject = { propOne: 'test1', propTwo: 'wow, how awesome' };
testObjectmap.add(myObject);
let clonedArray = testObjectmap.getArray();
expect(clonedArray[clonedArray.length - 1]).to.eql(myObject);
});
tap.test('should get one object and then remove it', async () => {
let originalLength = testObjectmap.getArray().length;
let oneObject = testObjectmap.getOneAndRemove();
// tslint:disable-next-line:no-unused-expression
expect(oneObject).not.be.null;
expect(testObjectmap.getArray().length).equal(originalLength - 1);
expect(testObjectmap.getArray()).to.not.contain(oneObject);
});
tap.start();

88
test/test.stringmap.ts Normal file
View File

@ -0,0 +1,88 @@
// 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';
// testData
let testStringmap: lik.Stringmap;
let testString1 = 'testString1';
let testString2 = 'testString2';
let testString3 = 'testString3';
let testString4 = 'testString4';
let testString5 = 'testString5';
let testString6 = 'testString6';
// tests
tap.test('new lik.Objectmap() -> should create an instance of Stringmap', async () => {
testStringmap = new lik.Stringmap();
expect(testStringmap).be.instanceof(lik.Stringmap);
});
tap.test(
'lik.Stringmap.checkString -> should return false for an string not in Stringmap',
async () => {
// tslint:disable-next-line:no-unused-expression
expect(testStringmap.checkString(testString1)).be.false;
}
);
tap.test('lik.Stringmap.addString -> should add an string to Stringmap', async () => {
testStringmap.addString(testString1);
testStringmap.addString(testString2);
testStringmap.addString(testString3);
// tslint:disable-next-line:no-unused-expression
expect(testStringmap.checkString(testString1)).be.true;
// tslint:disable-next-line:no-unused-expression
expect(testStringmap.checkString(testString2)).be.true;
// tslint:disable-next-line:no-unused-expression
expect(testStringmap.checkString(testString3)).be.true;
// tslint:disable-next-line:no-unused-expression
expect(testStringmap.checkMinimatch('*String1')).be.true;
// tslint:disable-next-line:no-unused-expression
expect(testStringmap.checkMinimatch('*String2')).be.true;
// tslint:disable-next-line:no-unused-expression
expect(testStringmap.checkMinimatch('*String4')).be.false;
});
tap.test('lik.Stringmap.addStringArray -> should add an array of strings', async () => {
testStringmap.addStringArray([testString4, testString5, testString6]);
// tslint:disable-next-line:no-unused-expression
expect(testStringmap.checkMinimatch('*String4')).be.true;
});
tap.test('lik.Stringmap.removeString -> should remove a string from Stringmap', async () => {
testStringmap.removeString(testString2);
// tslint:disable-next-line:no-unused-expression
expect(testStringmap.checkString(testString2)).be.false;
});
tap.test('lik.Stringmap.getStringArray() -> should return a copy of stringArray', async () => {
let clonedArray = testStringmap.getStringArray();
// tslint:disable-next-line:no-unused-expression
expect(clonedArray[0] === 'testString1').be.true;
// tslint:disable-next-line:no-unused-expression
expect(clonedArray[0] === testString1).be.true;
});
tap.test(
'lik.Stringmap.checkIsEmpty() -> should register a function to trigger when empty',
async () => {
testStringmap.registerUntilTrue(
() => {
return testStringmap.checkIsEmpty();
},
() => {
console.log('Stringmap now is empty');
}
);
}
);
tap.test('lik.Stringmap.empty() -> should remove wipe and then notify', async () => {
testStringmap.wipe();
});
tap.start();

View File

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

40
test/test.tree.ts Normal file
View 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).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.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();

View File

@ -1,121 +1 @@
import 'typings-test' import './test.objectmap';
import * as events from 'events'
import * as rx from 'rxjs/Rx'
import * as should from 'should'
import lik = require('../dist/index')
describe('lik',function(){
describe('Stringmap',function(){
let testStringmap: lik.Stringmap
let testString1 = 'testString1'
let testString2 = 'testString2'
let testString3 = 'testString3'
let testString4 = 'testString4'
let testString5 = 'testString5'
let testString6 = 'testString6'
it('should create an instance of Stringmap',function(){
testStringmap = new lik.Stringmap()
should(testStringmap).be.instanceof(lik.Stringmap)
})
it('should return false for an string not in Stringmap',function(){
should(testStringmap.checkString(testString1)).be.false()
})
it('should add an string to Stringmap',function(){
testStringmap.addString(testString1)
testStringmap.addString(testString2)
testStringmap.addString(testString3)
should(testStringmap.checkString(testString1)).be.true()
should(testStringmap.checkString(testString2)).be.true()
should(testStringmap.checkString(testString3)).be.true()
should(testStringmap.checkMinimatch('*String1')).be.true()
should(testStringmap.checkMinimatch('*String2')).be.true()
should(testStringmap.checkMinimatch('*String4')).be.false()
})
it('should add an array of strings',function(){
testStringmap.addStringArray([testString4,testString5,testString6])
should(testStringmap.checkMinimatch('*String4')).be.true()
})
it('should remove a string from Stringmap',function(){
testStringmap.removeString(testString2)
should(testStringmap.checkString(testString2)).be.false()
})
it('should return a copy of stringArray',function(){
let clonedArray = testStringmap.getStringArray()
should(clonedArray[0] === 'testString1').be.true()
should(clonedArray[0] === testString1).be.true()
})
it('should register a function to trigger when empty',function(){
testStringmap.registerUntilTrue(
() => { return testStringmap.checkIsEmpty() },
() => { console.log('Stringmap now is empty') }
)
})
it('should remove wipe and then notify',function(){
testStringmap.wipe()
})
})
describe('Objectmap',function(){
interface ITestObject {
propOne: string
propTwo: string
}
let testObjectmap: lik.Objectmap<ITestObject>
let testObject1: ITestObject = {
propOne: 'hello',
propTwo: 'hello2'
}
let testObject2: ITestObject = {
propOne: 'hello',
propTwo: 'hello2'
}
it('should correctly instantiate an Objectmap',function(){
testObjectmap = new lik.Objectmap<ITestObject>()
should(testObjectmap).be.instanceof(lik.Objectmap)
})
it('should correctly add an object to Objectmap',function(){
testObjectmap.add(testObject1)
should(testObjectmap.checkForObject(testObject1)).be.true
should(testObjectmap.checkForObject(testObject2)).be.false
})
it('should correctly remove an object to Objectmap',function(){
testObjectmap.add(testObject2)
testObjectmap.remove(testObject1)
should(testObjectmap.checkForObject(testObject1)).be.false
should(testObjectmap.checkForObject(testObject2)).be.true
})
it('should correctly run a function forEach map object',function(){
testObjectmap.forEach(itemArg => {
should(itemArg).have.ownProperty('propOne')
})
})
it('should correctly find an object',function(){
let myObject = {propOne: 'helloThere', propTwo: 'helloAnyway'}
testObjectmap.add(myObject)
let referenceObject = testObjectmap.find((itemArg) => { return (itemArg.propOne === 'helloThere') })
should(myObject === referenceObject).be.true()
})
})
describe('Observablemap',function(){
let testObservablemap: lik.Observablemap
let testObservable1: rx.Observable<any>
let testObservable2: rx.Observable<any>
let testObservable3: rx.Observable<any>
let testEmitter: events.EventEmitter
it('should create an instance',function(){
testObservablemap = new lik.Observablemap()
should(testObservablemap).be.instanceof(lik.Observablemap)
})
it('should accept a new emitter',function(done) {
testEmitter = new events.EventEmitter()
testObservable1 = testObservablemap.getObservableForEmitterEvent(testEmitter,'event1')
testObservable1.subscribe(x => {
done()
})
testObservable2 = testObservablemap.getObservableForEmitterEvent(testEmitter,'event1')
testObservable3 = testObservablemap.getObservableForEmitterEvent(testEmitter, 'event2')
should(testObservable1 === testObservable2).be.true()
should(testObservable1 === testObservable3).be.false()
testEmitter.emit('event1')
})
})
})

View File

@ -1,7 +1,11 @@
import * as plugins from './lik.plugins' import * as plugins from './lik.plugins';
// import modules // import modules
export * from './lik.stringmap' export * from './lik.interestmap';
export * from './lik.objectmap' export * from './lik.limitedarray';
export * from './lik.observablemap' export * from './lik.looptracker';
export * from './lik.objectmap';
export * from './lik.stringmap';
export * from './lik.timedaggregator';
export * from './lik.tree';

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

@ -0,0 +1,11 @@
import * as plugins from './lik.plugins';
export class FastMap<T> {
private mapObject: { [key: string]: T } = {};
public isUniqueKey() {}
public addToMap(identifier: string, objectArg: T) {
this.mapObject[identifier] = objectArg;
}
}

View File

@ -0,0 +1,78 @@
import * as plugins from './lik.plugins';
import { InterestMap, IInterestComparisonFunc } from './lik.interestmap';
export class Interest<DTInterestId, 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>
) {
this.originalInterest = interestArg;
this.comparisonFunc = comparisonFuncArg;
this.interestMapRef = interestMapArg;
this.destructionTimer.completed.then(() => {
this.destroy();
});
}
// ===============================
// LIFECYCLE MANAGEMENT
// ===============================
/**
* self destructs the interest
*/
public destroy() {
this.interestMapRef.removeInterest(this);
}
/**
* 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();
}
}

114
ts/lik.interestmap.ts Normal file
View File

@ -0,0 +1,114 @@
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 class InterestMap<DTInterestId, DTInterestFullfillment> {
/**
* 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>) {
this.comparisonFunc = comparisonFuncArg;
}
/**
* adds an interest to the InterestMap
* @param objectArg
*/
public async addInterest(
objectArg: DTInterestId
): Promise<Interest<DTInterestId, DTInterestFullfillment>> {
const comparisonString = this.comparisonFunc(objectArg);
let returnInterest: Interest<DTInterestId, DTInterestFullfillment>;
const newInterest = new Interest<DTInterestId, DTInterestFullfillment>(
this,
objectArg,
this.comparisonFunc
);
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.findOneAndRemove(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.find(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.find(interest => {
return interest.comparisonString === comparableString;
});
return interest; // if an interest is found, the interest is returned, otherwise interest is null
}
}

42
ts/lik.limitedarray.ts Normal file
View File

@ -0,0 +1,42 @@
import * as plugins from './lik.plugins';
export class LimitedArray<T> {
array: T[] = [];
arrayLimit: number;
constructor(limitArg: number) {
this.arrayLimit = limitArg;
}
addOne(objectArg: T) {
this.array.unshift(objectArg);
if (this.array.length > this.arrayLimit) {
this.array.length = this.arrayLimit;
}
}
addMany(objectArrayArg: T[]) {
for (let objectArg of objectArrayArg) {
this.addOne(objectArg);
}
}
setLimit(limitArg: number) {
this.arrayLimit = limitArg;
if (this.array.length > this.arrayLimit) {
this.array.length = this.arrayLimit;
}
}
getAverage(): number {
if (typeof this.array[0] === 'number') {
let sum = 0;
for (let localNumber of this.array) {
let localNumberAny: any = localNumber;
sum = sum + localNumberAny;
}
return sum / this.array.length;
} else {
return null;
}
}
}

18
ts/lik.looptracker.ts Normal file
View File

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

View File

@ -1,85 +1,167 @@
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;
} }
export interface IObjectmapFindFunction<T> { export interface IObjectmapFindFunction<T> {
(itemArg: T): boolean (itemArg: T): boolean;
} }
/** /**
* 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>();
private objectArray: T[] = [];
/** // events
* returns a new instance public eventSubject = new plugins.smartrx.rxjs.Subject<any>();
*/
constructor() {
/**
* returns a new instance
*/
constructor() {
// nothing here
}
/**
* adds an object mapped to a string
* the string must be unique
*/
addMappedUnique(uniqueKey: string, objectArg: T) {
this.add(objectArg);
this.fastMap.addToMap(uniqueKey, objectArg);
}
/**
* fastest way to get an object from the map
* @param uniqueKey
*/
public getMappedUnique(uniqueKey: string) {}
/**
* remove key
* @param functionArg
*/
public removeMappedUnique() {}
/**
* add object to Objectmap
* returns false if the object is already in the map
* returns true if the object was added successfully
*/
public add(objectArg: T): boolean {
if (this.checkForObject(objectArg)) {
// the object is already in the objectmap
return false;
} else {
// the object is not yet in the objectmap
this.objectArray.push(objectArg);
this.eventSubject.next('add');
return true;
} }
}
/** /**
* add object to Objectmap * like .add but adds an whole array of objects
*/ */
add(objectArg: T) { public addArray(objectArrayArg: T[]) {
this.objectArray.push(objectArg) for (let item of objectArrayArg) {
this.add(item);
} }
}
/** /**
* like .add but adds an whole array of objects * check if object is in Objectmap
*/ */
addArray(objectArrayArg: T[]) { public checkForObject(objectArg: T) {
for (let item of objectArrayArg) { return this.objectArray.indexOf(objectArg) !== -1;
this.add(item) }
}
}
/** /**
* remove object from Objectmap * find object
*/ */
remove(objectArg: T) { public find(findFunction: IObjectmapFindFunction<T>) {
let replacmentArray = [] const resultArray = this.objectArray.filter(findFunction);
for (let item of this.objectArray) { if (resultArray.length > 0) {
if (item !== objectArg) { return resultArray[0];
replacmentArray.push(item) } else {
} return null;
}
this.objectArray = replacmentArray
} }
}
/** /**
* check if object is in Objectmap * finds a specific element and then removes it
*/ */
checkForObject(objectArg: T) { public findOneAndRemove(findFunction: IObjectmapFindFunction<T>): T {
return this.objectArray.indexOf(objectArg) !== -1 const foundElement = this.find(findFunction);
if (foundElement) {
this.remove(foundElement);
} }
return foundElement;
}
/** /**
* find object * run function for each item in Objectmap
*/ */
find(findFunction: IObjectmapFindFunction<T>) { public async forEach(functionArg: IObjectmapForEachFunction<T>) {
let resultArray = this.objectArray.filter(findFunction) for (let object of this.objectArray) {
if (resultArray.length > 0) { await functionArg(object);
return resultArray[0]
} else {
return null
}
} }
}
/** /**
* run function for each item in Objectmap * gets an object in the Observablemap and removes it, so it can't be retrieved again
*/ */
forEach(functionArg: IObjectmapForEachFunction<T>) { public getOneAndRemove(): T {
return this.objectArray.forEach(functionArg) const removedItem = this.objectArray.shift();
} this.eventSubject.next('remove');
return removedItem;
}
/** /**
* wipe Objectmap * returns a cloned array of all the objects currently in the Objectmap
*/ */
wipe() { public getArray(): T[] {
this.objectArray = [] const returnArray: any[] = [];
for (const objectItem of this.objectArray) {
returnArray.push(objectItem);
} }
return returnArray;
}
/**
* check if Objectmap ist empty
*/
public isEmpty(): boolean {
if (this.objectArray.length === 0) {
return true;
} else {
return false;
}
}
/**
* remove object from Objectmap
*/
public remove(objectArg: T) {
let replacementArray = [];
for (let item of this.objectArray) {
if (item !== objectArg) {
replacementArray.push(item);
}
}
this.objectArray = replacementArray;
this.eventSubject.next('remove');
}
/**
* wipe Objectmap
*/
public wipe() {
this.objectArray = [];
this.eventSubject.next('wiped');
}
} }

View File

@ -1,35 +0,0 @@
import * as plugins from './lik.plugins'
import { Objectmap } from './lik.objectmap'
import { Stringmap } from './lik.stringmap'
import { Observable } from 'rxjs/Rx'
/**
* bundles an observable with an emitter
*/
export interface ObservableEmitterBundle {
observable: plugins.rx.Observable<any>
emitter: plugins.events.EventEmitter
event: string
}
export class Observablemap {
ObservableEmitterBundleObjectmap = new Objectmap<ObservableEmitterBundle>()
getObservableForEmitterEvent(emitterArg: plugins.events.EventEmitter, eventArg: string) {
let existingBundle = this.ObservableEmitterBundleObjectmap.find((bundleArg) => {
return(bundleArg.emitter === emitterArg && bundleArg.event === eventArg)
})
if (existingBundle) {
return existingBundle.observable
} else {
let emitterObservable = plugins.rx.Observable.fromEvent(emitterArg, eventArg)
this.ObservableEmitterBundleObjectmap.add({
observable: emitterObservable,
emitter: emitterArg,
event: eventArg
})
return emitterObservable
}
}
}

View File

@ -1,6 +1,25 @@
import 'typings-global' // ==============
export import q = require('q') // native
export import events = require('events') // ==============
export import lodash = require('lodash')
export import minimatch = require('minimatch') import * as events from 'events';
export import rx = require('rxjs/Rx')
export { events };
// ==============
// @pushrocks
// ==============
import * as smartdelay from '@pushrocks/smartdelay';
import * as smartpromise from '@pushrocks/smartpromise';
import * as smartrx from '@pushrocks/smartrx';
import * as smarttime from '@pushrocks/smarttime';
export { smartdelay, smartpromise, smartrx, smarttime };
// ==============
// third party
// ==============
import minimatch from 'minimatch';
const symbolTree = require('symbol-tree');
export { minimatch, symbolTree };

View File

@ -1,114 +1,115 @@
import * as plugins from './lik.plugins' 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 interface ITriggerFunction {
(): boolean (): boolean;
} }
export class Stringmap { export class Stringmap {
private _stringArray: string[] = [] private _stringArray: string[] = [];
private _triggerUntilTrueFunctionArray: ITriggerFunction[] = [] private _triggerUntilTrueFunctionArray: ITriggerFunction[] = [];
constructor() {} constructor() {}
/** /**
* add a string to the Stringmap * add a string to the Stringmap
*/ */
addString(stringArg: string) { addString(stringArg: string) {
this._stringArray.push(stringArg) this._stringArray.push(stringArg);
this.notifyTrigger() this.notifyTrigger();
}
/**
* like addString, but accepts an array of strings
*/
addStringArray(stringArrayArg: string[]) {
for (const stringItem of stringArrayArg) {
this.addString(stringItem);
} }
}
/** /**
* like addString, but accepts an array of strings * removes a string from Stringmap
*/ */
addStringArray(stringArrayArg: string[]) { removeString(stringArg: string) {
for (let stringItem of stringArrayArg){ for (const keyArg in this._stringArray) {
this.addString(stringItem) if (this._stringArray[keyArg] === stringArg) {
} this._stringArray.splice(parseInt(keyArg), 1);
}
} }
this.notifyTrigger();
}
/** /**
* removes a string from Stringmap * wipes the Stringmap
*/ */
removeString(stringArg: string) { wipe() {
for (let keyArg in this._stringArray) { this._stringArray = [];
if (this._stringArray[keyArg] === stringArg) { this.notifyTrigger();
this._stringArray.splice(parseInt(keyArg),1) }
}
} /**
this.notifyTrigger() * check if string is in Stringmap
*/
public checkString(stringArg: string): boolean {
return this._stringArray.indexOf(stringArg) !== -1;
}
/**
* checks stringPresence with minimatch
*/
public checkMinimatch(miniMatchStringArg: string): boolean {
let foundMatch: boolean = false;
for (const stringItem of this._stringArray) {
if (plugins.minimatch(stringItem, miniMatchStringArg)) {
foundMatch = true;
}
} }
return foundMatch;
}
/** /**
* wipes the Stringmap * checks if the Stringmap is empty
*/ */
wipe() { public checkIsEmpty() {
this._stringArray = [] return this._stringArray.length === 0;
this.notifyTrigger() }
/**
* gets a cloned copy of the current string Array
*/
public getStringArray() {
const returnArray: string[] = [];
for (const stringItem of this._stringArray) {
returnArray.push(stringItem);
} }
return returnArray;
}
/** // trigger registering
* check if string is in Stringmap
*/
checkString(stringArg: string): boolean {
return this._stringArray.indexOf(stringArg) !== -1
}
/** /**
* checks stringPresence with minimatch * register a new trigger
*/ */
checkMinimatch(miniMatchStringArg: string): boolean { public registerUntilTrue(functionArg: ITriggerFunction, doFunctionArg) {
let foundMatch: boolean = false this._triggerUntilTrueFunctionArray.push(() => {
for (let stringItem of this._stringArray){ const result = functionArg();
if (plugins.minimatch(stringItem,miniMatchStringArg)) { if (result === true) {
foundMatch = true doFunctionArg();
} }
} return result;
return foundMatch });
} this.notifyTrigger();
}
/**
* checks if the Stringmap is empty
*/
checkIsEmpty() {
return (this._stringArray.length === 0)
}
/**
* gets a cloned copy of the current string Array
*/
getStringArray() {
return plugins.lodash.cloneDeep(this._stringArray)
}
// trigger registering
/**
* register a new trigger
*/
registerUntilTrue(functionArg: ITriggerFunction,doFunctionArg) {
this._triggerUntilTrueFunctionArray.push(
() => {
let result = functionArg()
if (result === true) {
doFunctionArg()
}
return result
}
)
this.notifyTrigger()
}
/**
* notifies triggers
*/
private notifyTrigger() {
let filteredArray = this._triggerUntilTrueFunctionArray.filter((functionArg) => {
return !functionArg()
})
this._triggerUntilTrueFunctionArray = filteredArray
}
/**
* notifies triggers
*/
private notifyTrigger() {
const filteredArray = this._triggerUntilTrueFunctionArray.filter(functionArg => {
return !functionArg();
});
this._triggerUntilTrueFunctionArray = filteredArray;
}
} }

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

@ -0,0 +1,41 @@
import * as plugins from './lik.plugins';
export interface ITimedAggregatorOptions<T> {
aggregationIntervalInMillis: number;
functionForAggregation: (input: T[]) => void;
}
export class TimedAggregtor<T> {
public options: ITimedAggregatorOptions<T>;
private storageArray: T[] = [];
constructor(optionsArg: ITimedAggregatorOptions<T>) {
this.options = optionsArg;
}
private aggregationTimer: plugins.smarttime.Timer;
private checkAggregationStatus() {
const addAggregationTimer = () => {
this.aggregationTimer = new plugins.smarttime.Timer(this.options.aggregationIntervalInMillis);
this.aggregationTimer.completed.then(() => {
const aggregateForProcessing = this.storageArray;
if (aggregateForProcessing.length === 0) {
this.aggregationTimer = null;
return;
}
this.storageArray = [];
addAggregationTimer();
this.options.functionForAggregation(aggregateForProcessing);
});
this.aggregationTimer.start();
};
if (!this.aggregationTimer) {
addAggregationTimer();
}
}
public add(aggregationArg: T) {
this.storageArray.push(aggregationArg);
this.checkAggregationStatus();
}
}

141
ts/lik.tree.ts Normal file
View File

@ -0,0 +1,141 @@
import * as plugins from './lik.plugins';
export class Tree<T> {
symbolTree: any;
constructor() {
this.symbolTree = new plugins.symbolTree();
}
// =======================================
// Functions that map to the functionality of symbol-tree
// =======================================
/**
*
* @param objectArg
*/
initialize(objectArg: T): T {
return this.symbolTree.initialize(objectArg);
}
hasChildren(objectArg: T): boolean {
return this.symbolTree.hasChildren(objectArg);
}
firstChild(objectArg: T): T {
return this.symbolTree.firstChild(objectArg);
}
lastChild(objectArg: T): T {
return this.symbolTree.lastChild(objectArg);
}
previousSibling(objectArg: T): T {
return this.symbolTree.previousSibling(objectArg);
}
nextSibling(objectArg: T): T {
return this.symbolTree.nextSibling(objectArg);
}
parent(objectArg: T): T {
return this.symbolTree.parent(objectArg);
}
lastInclusiveDescendant(objectArg: T): T {
return this.symbolTree.lastInclusiveDescendant(objectArg);
}
preceding(objectArg: T, optionsArg?: any): T {
return this.symbolTree.preceding(objectArg, optionsArg);
}
following(object: T, optionsArg: any) {
return this.symbolTree.following(object, optionsArg);
}
childrenToArray(parentArg: T, optionsArg: any): T[] {
return this.symbolTree.childrenToArray(parentArg, optionsArg);
}
ancestorsToArray(objectArg: T, optionsArg: any): T[] {
return this.symbolTree.ancestorsToArray(objectArg, optionsArg);
}
treeToArray(rootArg, optionsArg: any): T[] {
return this.symbolTree.treeToArray(rootArg, optionsArg);
}
childrenIterator(parentArg: T, optionsArg): T {
return this.symbolTree.childrenIterator(parentArg, optionsArg);
}
previousSiblingsIterator(objectArg): T {
return this.symbolTree.previousSiblingsIterator(objectArg);
}
nextSiblingsIterator(objectArg: T) {
return this.symbolTree.nextSiblingsIterator();
}
ancestorsIterator(objectArg) {
this.symbolTree.ancestorsIterator();
}
treeIterator(rootArg: T, optionsArg): Iterable<T> {
return this.symbolTree.treeIterator(rootArg);
}
index(childArg: T): number {
return this.symbolTree.index(childArg);
}
childrenCount(parentArg: T): number {
return this.symbolTree.childrenCount(parentArg);
}
compareTreePosition(leftArg: T, rightArg: T): number {
return this.compareTreePosition(leftArg, rightArg);
}
remove(removeObjectArg: T): T {
return this.symbolTree.remove(removeObjectArg);
}
insertBefore(referenceObjectArg: T, newObjectArg: T): T {
return this.symbolTree.insertBefore(referenceObjectArg, newObjectArg);
}
insertAfter(referenceObject: T, newObjectArg: T) {
return this.symbolTree.insertAfter(referenceObject, newObjectArg);
}
prependChild(referenceObjectArg: T, newObjectArg: T): T {
return this.symbolTree.prependChild(referenceObjectArg, newObjectArg);
}
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) {
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) {}
}

View File

@ -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"
} }