You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
2.8 KiB
152 lines
2.8 KiB
# pull-window |
|
|
|
Aggregate a pull-stream into windows. |
|
|
|
Several helpers are provided for particular types of windows, |
|
sliding, tumbling, etc. |
|
|
|
And also, a low level |
|
|
|
## Example: "tumbling" window |
|
|
|
sum every 10 items. |
|
|
|
``` js |
|
var pull = require('pull-stream') |
|
var window = require('pull-window') |
|
|
|
function everyTen () { |
|
var i = 0 |
|
//window calls init with each data item, |
|
//and a callback to close that window. |
|
return window(function (data, cb) { |
|
//if you don't want to start a window here, |
|
//return undefined |
|
if(i != 0) return |
|
var sum = 0 |
|
|
|
//else return a function. |
|
//this will be called all data |
|
//until you callback. |
|
return function (end, data) { |
|
if(end) return cb(null, sum) |
|
sum += data |
|
if(++i >= 10) { |
|
i = 0 |
|
cb(null, sum) |
|
} |
|
} |
|
} |
|
} |
|
|
|
pull( |
|
pull.count(1000), |
|
everyTen(), |
|
pull.log() |
|
) |
|
``` |
|
|
|
## Example: variable sized window |
|
|
|
Each window doesn't have to be the same size... |
|
|
|
``` js |
|
var pull = require('pull-stream') |
|
var window = require('pull-window') |
|
|
|
function groupTo100 () { |
|
var sum = null |
|
return window(function (_, cb) { |
|
if(sum != null) return |
|
|
|
//sum stuff together until you have 100 or more |
|
return function (end, data) { |
|
if(end) return cb(null, sum) |
|
sum += data |
|
if(sum >= 100) { |
|
//copy sum like this, incase the next item |
|
//comes through sync |
|
var _sum = sum; sum = null |
|
cb(null, _sum) |
|
} |
|
} |
|
}) |
|
} |
|
|
|
pull( |
|
pull.count(1000) |
|
groupTo100(), |
|
pull.log() |
|
) |
|
``` |
|
|
|
## Example: sliding window |
|
|
|
to make more over lapping windows |
|
just return the window function more often. |
|
|
|
``` js |
|
var pull = require('pull-stream') |
|
var window = require('pull-window') |
|
|
|
function sliding () { |
|
return window(function (_, cb) { |
|
var sum = 0, i = 0 |
|
|
|
//sum stuff together until you have 100 or more |
|
return function (end, data) { |
|
if(end) return cb(null, sum) |
|
sum += data |
|
if(++i >= 10) { |
|
//in this example, each window gets it's own sum, |
|
//so we don't need to copy it. |
|
cb(null, sum) |
|
} |
|
} |
|
}) |
|
} |
|
|
|
pull( |
|
pull.count(100) |
|
sliding(), |
|
pull.log() |
|
) |
|
``` |
|
|
|
|
|
## API |
|
|
|
|
|
### window (start, map) |
|
``` js |
|
|
|
window(function startWindow (data, cb) { |
|
|
|
//called on each chunk |
|
//including the first one |
|
return function addToWindow (end, data) { |
|
//cb(null, aggregate) when done. |
|
} |
|
}, function mapWindow (start, data) { |
|
//(optional) |
|
//map the window to something that tracks start, also |
|
}) |
|
``` |
|
|
|
By default, windows are mapped to `{start: firstData, data: aggregate}`. |
|
unless you pass in an different `mapWindow` function. |
|
|
|
|
|
### window.sliding(reduce, size) |
|
|
|
reduce every `size` items into a single value, in a sliding window |
|
|
|
### window.recent(size, time) |
|
|
|
tumbling window that groups items onto an array, |
|
either every `size` items, or within `time` ms, |
|
which ever occurs earliest. |
|
|
|
## License |
|
|
|
MIT
|
|
|