From 608a2b6b823bc5e9af0b9768f49324c8b5626528 Mon Sep 17 00:00:00 2001 From: Adam Pearce <1wheel@gmail.com> Date: Mon, 11 Dec 2017 23:41:51 -0500 Subject: [PATCH] adds namespaced timers - closes #55 --- README.md | 7 +++++-- build/d3-jetpack.js | 44 +++++++++++++++++++++++++++++++++++++++---- build/d3v4+jetpack.js | 39 +++++++++++++++++++++++++++++++++++--- d3-index.js | 5 ++++- index.js | 5 ++++- package.json | 5 +++-- src/interval.js | 12 ++++++++++++ src/timeout.js | 12 ++++++++++++ src/timer.js | 12 ++++++++++++ test/index.html | 3 +++ 10 files changed, 131 insertions(+), 13 deletions(-) create mode 100644 src/interval.js create mode 100644 src/timeout.js create mode 100644 src/timer.js diff --git a/README.md b/README.md index b6f1675..633c6f7 100644 --- a/README.md +++ b/README.md @@ -201,8 +201,11 @@ var fruits = [{ name: "Apple", color: "green" }, { name: "Banana", color: "yello fruits.sort(d3.ascendingKey('color')); ``` -# d3.nestBy(array, key) [<>](https://github.com/gka/d3-jetpack/blob/master/src/nestBy.js "Source") +# d3.timer(callback[, delay[, time[, namespace]]]) [<>](https://github.com/gka/d3-jetpack/blob/master/src/timer.js "Source") + +`d3.timer`, `d3.timeout` and `d3.interval` all now take an optional namespace argument. Previous timers with the same namespace as a new timer are stopped. + +# d3.nestBy(array, key) [<>](https://github.com/gka/d3-jetpack/blob/master/src/nestBy.js "Source") Shorthand for `d3.nest().key(key).entries(array)`. Returns an array of arrays, instead of a `key`/`value` pairs. The `key` property of each array is equal the value returned by the `key` function when it is called with element of the array. diff --git a/build/d3-jetpack.js b/build/d3-jetpack.js index 03ded30..95d74ea 100644 --- a/build/d3-jetpack.js +++ b/build/d3-jetpack.js @@ -1,9 +1,9 @@ // https://github.com/gka/d3-jetpack#readme Version 2.0.15. Copyright 2017 Gregor Aisch. (function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-selection'), require('d3-transition'), require('d3-array'), require('d3-axis'), require('d3-scale'), require('d3-collection'), require('d3-queue'), require('d3-request')) : - typeof define === 'function' && define.amd ? define(['exports', 'd3-selection', 'd3-transition', 'd3-array', 'd3-axis', 'd3-scale', 'd3-collection', 'd3-queue', 'd3-request'], factory) : - (factory((global.d3 = global.d3 || {}),global.d3,global.d3,global.d3,global.d3,global.d3,global.d3,global.d3,global.d3)); -}(this, (function (exports,d3Selection,d3Transition,d3Array,d3Axis,d3Scale,d3Collection,d3Queue,d3Request) { 'use strict'; + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-selection'), require('d3-transition'), require('d3-array'), require('d3-axis'), require('d3-scale'), require('d3-collection'), require('d3-queue'), require('d3-request'), require('d3-timer')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-selection', 'd3-transition', 'd3-array', 'd3-axis', 'd3-scale', 'd3-collection', 'd3-queue', 'd3-request', 'd3-timer'], factory) : + (factory((global.d3 = global.d3 || {}),global.d3,global.d3,global.d3,global.d3,global.d3,global.d3,global.d3,global.d3,global.d3)); +}(this, (function (exports,d3Selection,d3Transition,d3Array,d3Axis,d3Scale,d3Collection,d3Queue,d3Request,d3Timer) { 'use strict'; var translateSelection = function(xy, dim) { var node = this.node(); @@ -486,6 +486,39 @@ function polygonClosed(coordinates) { return !(a[0] - b[0] || a[1] - b[1]); } +var prev = {}; + +var timer$1 = function(fn, delay, time, name){ + if (prev[name]) prev[name].stop(); + + var newTimer = d3Timer.timer(fn, delay, time, name); + if (name) prev[name] = newTimer; + + return newTimer +}; + +var prev$1 = {}; + +var interval$1 = function(fn, delay, time, name){ + if (prev$1[name]) prev$1[name].stop(); + + var newTimer = d3Timer.interval(fn, delay, time, name); + if (name) prev$1[name] = newTimer; + + return newTimer +}; + +var prev$2 = {}; + +var timeout$1 = function(fn, delay, time, name){ + if (prev$2[name]) prev$2[name].stop(); + + var newTimer = d3Timer.timeout(fn, delay, time, name); + if (name) prev$2[name] = newTimer; + + return newTimer +}; + d3Selection.selection.prototype.translate = translateSelection; d3Transition.transition.prototype.translate = translateSelection; d3Selection.selection.prototype.append = append; @@ -513,6 +546,9 @@ exports.nestBy = nestBy; exports.round = round; exports.clamp = clamp; exports.polygonClip = polygonClip; +exports.timer = timer$1; +exports.interval = interval$1; +exports.timeout = timeout$1; Object.defineProperty(exports, '__esModule', { value: true }); diff --git a/build/d3v4+jetpack.js b/build/d3v4+jetpack.js index 8f925a2..3bf6771 100644 --- a/build/d3v4+jetpack.js +++ b/build/d3v4+jetpack.js @@ -17326,6 +17326,39 @@ function polygonClosed(coordinates) { return !(a[0] - b[0] || a[1] - b[1]); } +var prev = {}; + +var timer$1 = function(fn, delay, time, name){ + if (prev[name]) prev[name].stop(); + + var newTimer = timer(fn, delay, time, name); + if (name) prev[name] = newTimer; + + return newTimer +}; + +var prev$1 = {}; + +var interval$2 = function(fn, delay, time, name){ + if (prev$1[name]) prev$1[name].stop(); + + var newTimer = interval$1(fn, delay, time, name); + if (name) prev$1[name] = newTimer; + + return newTimer +}; + +var prev$2 = {}; + +var timeout$2 = function(fn, delay, time, name){ + if (prev$2[name]) prev$2[name].stop(); + + var newTimer = timeout$1(fn, delay, time, name); + if (name) prev$2[name] = newTimer; + + return newTimer +}; + selection.prototype.translate = translateSelection; transition.prototype.translate = translateSelection; selection.prototype.append = append; @@ -17357,6 +17390,9 @@ exports.nestBy = nestBy; exports.round = round; exports.clamp = clamp; exports.polygonClip = polygonClip; +exports.timer = timer$1; +exports.timeout = timeout$2; +exports.interval = interval$2; exports.version = version; exports.bisect = bisectRight; exports.bisectRight = bisectRight; @@ -17741,10 +17777,7 @@ exports.timeFormatLocale = formatLocale$1; exports.isoFormat = formatIso; exports.isoParse = parseIso; exports.now = now; -exports.timer = timer; exports.timerFlush = timerFlush; -exports.timeout = timeout$1; -exports.interval = interval$1; exports.transition = transition; exports.active = active; exports.interrupt = interrupt; diff --git a/d3-index.js b/d3-index.js index d75b7c3..a3e604f 100644 --- a/d3-index.js +++ b/d3-index.js @@ -20,5 +20,8 @@ export { nestBy, round, clamp, - polygonClip + polygonClip, + timer, + timeout, + interval } from "./index.js"; diff --git a/index.js b/index.js index a14fb04..f16e095 100644 --- a/index.js +++ b/index.js @@ -37,4 +37,7 @@ export {default as loadData} from "./src/loadData"; export {default as nestBy} from "./src/nestBy"; export {default as round} from "./src/round"; export {default as clamp} from "./src/clamp"; -export {default as polygonClip} from "./src/polygonClip"; \ No newline at end of file +export {default as polygonClip} from "./src/polygonClip"; +export {default as timer} from "./src/timer"; +export {default as interval} from "./src/interval"; +export {default as timeout} from "./src/timeout"; diff --git a/package.json b/package.json index 5b006ec..aa983ea 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "jsnext:main": "index", "module": "index", "scripts": { - "pretest": "rm -rf build && mkdir build && rollup --banner \"$(preamble)\" -f umd -g d3-selection:d3,d3-transition:d3,d3-axis:d3,d3-scale:d3,d3-queue:d3,d3-array:d3,d3-collection:d3,d3-request:d3 -n d3 -o build/d3-jetpack.js -- index.js", + "pretest": "rm -rf build && mkdir build && rollup --banner \"$(preamble)\" -f umd -g d3-selection:d3,d3-transition:d3,d3-axis:d3,d3-scale:d3,d3-queue:d3,d3-array:d3,d3-collection:d3,d3-request:d3,d3-timer:d3 -n d3 -o build/d3-jetpack.js -- index.js", "test": "tape 'test/test-*.js'", "prepublish": "npm run pretest && bin/rollup" }, @@ -19,8 +19,8 @@ "rollup": "0.41", "rollup-plugin-ascii": "0.0", "rollup-plugin-node-resolve": "2", - "tape": "4", "svgdom": "^0.0.15", + "tape": "4", "uglify-js": "2" }, "repository": { @@ -60,6 +60,7 @@ "d3-request": "1", "d3-scale": "1", "d3-selection": "1", + "d3-timer": "1", "d3-transition": "1" } } diff --git a/src/interval.js b/src/interval.js new file mode 100644 index 0000000..6ee34b7 --- /dev/null +++ b/src/interval.js @@ -0,0 +1,12 @@ +import {interval} from "d3-timer"; + +var prev = {} + +export default function(fn, delay, time, name){ + if (prev[name]) prev[name].stop() + + var newTimer = interval(fn, delay, time, name) + if (name) prev[name] = newTimer + + return newTimer +} \ No newline at end of file diff --git a/src/timeout.js b/src/timeout.js new file mode 100644 index 0000000..c8b9182 --- /dev/null +++ b/src/timeout.js @@ -0,0 +1,12 @@ +import {timeout} from "d3-timer"; + +var prev = {} + +export default function(fn, delay, time, name){ + if (prev[name]) prev[name].stop() + + var newTimer = timeout(fn, delay, time, name) + if (name) prev[name] = newTimer + + return newTimer +} \ No newline at end of file diff --git a/src/timer.js b/src/timer.js new file mode 100644 index 0000000..d77a30d --- /dev/null +++ b/src/timer.js @@ -0,0 +1,12 @@ +import {timer} from "d3-timer"; + +var prev = {} + +export default function(fn, delay, time, name){ + if (prev[name]) prev[name].stop() + + var newTimer = timer(fn, delay, time, name) + if (name) prev[name] = newTimer + + return newTimer +} \ No newline at end of file diff --git a/test/index.html b/test/index.html index 818100b..a99a620 100644 --- a/test/index.html +++ b/test/index.html @@ -116,4 +116,7 @@ drawCicle([c.width/2, c.height/2]) + +// d3.timer(() => console.log('hell0'), 0, 0, 'hello-timer') + \ No newline at end of file