set-harmonic-interval
Advanced tools
| var counter = 0; | ||
| var buckets = {}; | ||
| var setHarmonicInterval = function (fn, ms) { | ||
| var _a; | ||
| var id = counter++; | ||
| if (buckets[ms]) { | ||
| buckets[ms].listeners[id] = fn; | ||
| } | ||
| else { | ||
| var timer = setInterval(function () { | ||
| var listeners = buckets[ms].listeners; | ||
| var didThrow = false; | ||
| var lastError; | ||
| for (var _i = 0, _a = Object.values(listeners); _i < _a.length; _i++) { | ||
| var listener = _a[_i]; | ||
| try { | ||
| listener(); | ||
| } | ||
| catch (error) { | ||
| didThrow = true; | ||
| lastError = error; | ||
| } | ||
| } | ||
| if (didThrow) | ||
| throw lastError; | ||
| }, ms); | ||
| buckets[ms] = { | ||
| ms: ms, | ||
| timer: timer, | ||
| listeners: (_a = {}, | ||
| _a[id] = fn, | ||
| _a), | ||
| }; | ||
| } | ||
| return { | ||
| bucket: buckets[ms], | ||
| id: id, | ||
| }; | ||
| }; | ||
| var clearHarmonicInterval = function (_a) { | ||
| var bucket = _a.bucket, id = _a.id; | ||
| delete bucket.listeners[id]; | ||
| var hasListeners = false; | ||
| for (var listener in bucket.listeners) { | ||
| hasListeners = true; | ||
| break; | ||
| } | ||
| if (!hasListeners) { | ||
| clearInterval(bucket.timer); | ||
| delete buckets[bucket.ms]; | ||
| } | ||
| }; | ||
| export { clearHarmonicInterval, setHarmonicInterval }; |
| let counter = 0; | ||
| const buckets = {}; | ||
| const setHarmonicInterval = (fn, ms) => { | ||
| const id = counter++; | ||
| if (buckets[ms]) { | ||
| buckets[ms].listeners[id] = fn; | ||
| } | ||
| else { | ||
| const timer = setInterval(() => { | ||
| const { listeners } = buckets[ms]; | ||
| let didThrow = false; | ||
| let lastError; | ||
| for (const listener of Object.values(listeners)) { | ||
| try { | ||
| listener(); | ||
| } | ||
| catch (error) { | ||
| didThrow = true; | ||
| lastError = error; | ||
| } | ||
| } | ||
| if (didThrow) | ||
| throw lastError; | ||
| }, ms); | ||
| buckets[ms] = { | ||
| ms, | ||
| timer, | ||
| listeners: { | ||
| [id]: fn, | ||
| }, | ||
| }; | ||
| } | ||
| return { | ||
| bucket: buckets[ms], | ||
| id, | ||
| }; | ||
| }; | ||
| const clearHarmonicInterval = ({ bucket, id }) => { | ||
| delete bucket.listeners[id]; | ||
| let hasListeners = false; | ||
| for (const listener in bucket.listeners) { | ||
| hasListeners = true; | ||
| break; | ||
| } | ||
| if (!hasListeners) { | ||
| clearInterval(bucket.timer); | ||
| delete buckets[bucket.ms]; | ||
| } | ||
| }; | ||
| export { clearHarmonicInterval, setHarmonicInterval }; |
+8
-0
@@ -0,1 +1,9 @@ | ||
| ## [1.0.1](https://github.com/streamich/set-harmonic-interval/compare/v1.0.0...v1.0.1) (2019-10-23) | ||
| ### Bug Fixes | ||
| * husky hooks now should be defined in separate package.json field; ([6a444f7](https://github.com/streamich/set-harmonic-interval/commit/6a444f7)) | ||
| * prettier expects doubleqotes on file template ([d449a86](https://github.com/streamich/set-harmonic-interval/commit/d449a86)) | ||
| # 1.0.0 (2019-08-25) | ||
@@ -2,0 +10,0 @@ |
+0
-0
@@ -0,0 +0,0 @@ export declare type Listener = () => void; |
+28
-20
@@ -1,7 +0,10 @@ | ||
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| let counter = 0; | ||
| const buckets = {}; | ||
| exports.setHarmonicInterval = (fn, ms) => { | ||
| const id = counter++; | ||
| 'use strict'; | ||
| Object.defineProperty(exports, '__esModule', { value: true }); | ||
| var counter = 0; | ||
| var buckets = {}; | ||
| var setHarmonicInterval = function (fn, ms) { | ||
| var _a; | ||
| var id = counter++; | ||
| if (buckets[ms]) { | ||
@@ -11,7 +14,8 @@ buckets[ms].listeners[id] = fn; | ||
| else { | ||
| const timer = setInterval(() => { | ||
| const { listeners } = buckets[ms]; | ||
| let didThrow = false; | ||
| let lastError; | ||
| for (const listener of Object.values(listeners)) { | ||
| var timer = setInterval(function () { | ||
| var listeners = buckets[ms].listeners; | ||
| var didThrow = false; | ||
| var lastError; | ||
| for (var _i = 0, _a = Object.values(listeners); _i < _a.length; _i++) { | ||
| var listener = _a[_i]; | ||
| try { | ||
@@ -29,7 +33,7 @@ listener(); | ||
| buckets[ms] = { | ||
| ms, | ||
| timer, | ||
| listeners: { | ||
| [id]: fn, | ||
| }, | ||
| ms: ms, | ||
| timer: timer, | ||
| listeners: (_a = {}, | ||
| _a[id] = fn, | ||
| _a), | ||
| }; | ||
@@ -39,9 +43,10 @@ } | ||
| bucket: buckets[ms], | ||
| id, | ||
| id: id, | ||
| }; | ||
| }; | ||
| exports.clearHarmonicInterval = ({ bucket, id }) => { | ||
| var clearHarmonicInterval = function (_a) { | ||
| var bucket = _a.bucket, id = _a.id; | ||
| delete bucket.listeners[id]; | ||
| let hasListeners = false; | ||
| for (const listener in bucket.listeners) { | ||
| var hasListeners = false; | ||
| for (var listener in bucket.listeners) { | ||
| hasListeners = true; | ||
@@ -55,1 +60,4 @@ break; | ||
| }; | ||
| exports.clearHarmonicInterval = clearHarmonicInterval; | ||
| exports.setHarmonicInterval = setHarmonicInterval; |
+20
-10
| { | ||
| "name": "set-harmonic-interval", | ||
| "version": "1.0.0", | ||
| "version": "1.0.1", | ||
| "description": "", | ||
@@ -16,2 +16,6 @@ "author": { | ||
| "main": "lib/index.js", | ||
| "module": "lib/index.esm.js", | ||
| "esnext": "lib/index.next.esm.js", | ||
| "types": "lib/index.d.ts", | ||
| "typings": "lib/index.d.ts", | ||
| "files": [ | ||
@@ -21,13 +25,19 @@ "lib/" | ||
| "scripts": { | ||
| "prettier": "prettier --ignore-path .gitignore --write 'src/**/*.{ts,tsx,js,jsx}'", | ||
| "prettier:diff": "prettier -l 'src/**/*.{ts,tsx,js,jsx}'", | ||
| "prepush": "yarn prettier:diff", | ||
| "precommit": "pretty-quick --staged && yarn tslint", | ||
| "prettier": "prettier --ignore-path .gitignore --write \"src/**/*.{ts,tsx,js,jsx}\"", | ||
| "prettier:diff": "prettier -l \"src/**/*.{ts,tsx,js,jsx}\"", | ||
| "tslint": "tslint 'src/**/*.{js,jsx,ts,tsx}' -t verbose", | ||
| "commitmsg": "commitlint -E GIT_PARAMS", | ||
| "clean": "rimraf lib", | ||
| "build": "tsc", | ||
| "build": "rimraf ./dist && rollup --config", | ||
| "test": "jest --no-cache --config='jest.config.js'", | ||
| "release": "semantic-release" | ||
| "release": "semantic-release", | ||
| "demo1": "yarn build && node demo1.js", | ||
| "demo2": "yarn build && node demo2.js" | ||
| }, | ||
| "husky": { | ||
| "hooks": { | ||
| "commit-msg": "commitlint -E HUSKY_GIT_PARAMS", | ||
| "pre-commit": "pretty-quick --staged && yarn tslint", | ||
| "pre-push": "yarn prettier:diff" | ||
| } | ||
| }, | ||
| "keywords": [], | ||
@@ -47,2 +57,4 @@ "dependencies": {}, | ||
| "rimraf": "^3.0.0", | ||
| "rollup": "^1.20.3", | ||
| "rollup-plugin-typescript2": "^0.24.0", | ||
| "semantic-release": "^15.13.24", | ||
@@ -55,4 +67,2 @@ "ts-jest": "^24.0.2", | ||
| }, | ||
| "types": "lib/index.d.ts", | ||
| "typings": "lib/index.d.ts", | ||
| "release": { | ||
@@ -59,0 +69,0 @@ "verifyConditions": [ |
+20
-1
| # set-harmonic-interval | ||
| New project... | ||
| Works similar to `setInterval`, but calls all callbacks scheduled using `setHarmonicInterval` all at once, which have same | ||
| delay in milliseconds. | ||
| ## Install | ||
| ``` | ||
| npm install set-harmonic-interval | ||
| ``` | ||
| ## Usage | ||
| In below example `1` and `2` will always be printed together every second. | ||
| ```js | ||
| const { setHarmonicInterval, clearHarmonicInterval } = require('set-harmonic-interval'); | ||
| setHarmonicInterval(() => console.log(1), 1000); | ||
| setTimeout(() => { | ||
| setHarmonicInterval(() => console.log(2), 1000); | ||
| }, 500); | ||
| ``` | ||
| ## License | ||
| [Unlicense](LICENSE) — public domain. |
9440
83.16%8
33.33%172
168.75%29
190%19
11.76%