40 lines
1016 B
JavaScript
40 lines
1016 B
JavaScript
'use strict';
|
|
|
|
const {Transform} = require('stream');
|
|
|
|
class Take extends Transform {
|
|
constructor(options) {
|
|
super(Object.assign({}, options, {writableObjectMode: true, readableObjectMode: true}));
|
|
this._n = this._skip = 0;
|
|
if (options) {
|
|
'n' in options && (this._n = options.n);
|
|
'skip' in options && (this._skip = options.skip);
|
|
}
|
|
if (this._skip <= 0) {
|
|
this._transform = this._n > 0 ? this._countValues : this._doNothing;
|
|
}
|
|
}
|
|
_transform(chunk, encoding, callback) {
|
|
if (--this._skip <= 0) {
|
|
this._transform = this._n > 0 ? this._countValues : this._doNothing;
|
|
}
|
|
callback(null);
|
|
}
|
|
_countValues(chunk, encoding, callback) {
|
|
if (--this._n <= 0) {
|
|
this._transform = this._doNothing;
|
|
}
|
|
this.push(chunk);
|
|
callback(null);
|
|
}
|
|
_doNothing(chunk, encoding, callback) {
|
|
callback(null);
|
|
}
|
|
static make(n) {
|
|
return new Take(typeof n == 'object' ? n : {n});
|
|
}
|
|
}
|
|
Take.make.Constructor = Take;
|
|
|
|
module.exports = Take.make;
|