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

# 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