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.

49 lines
930 B

'use strict';
var filter = require('through2-filter').obj;
var stringify = require("json-stable-stringify-without-jsonify");
var ES6Set;
if (typeof global.Set === 'function') {
ES6Set = global.Set;
} else {
ES6Set = function() {
this.keys = [];
this.has = function(val) {
return this.keys.indexOf(val) !== -1;
},
this.add = function(val) {
this.keys.push(val);
}
}
}
function prop(propName) {
return function (data) {
return data[propName];
};
}
module.exports = unique;
function unique(propName, keyStore) {
keyStore = keyStore || new ES6Set();
var keyfn = stringify;
if (typeof propName === 'string') {
keyfn = prop(propName);
} else if (typeof propName === 'function') {
keyfn = propName;
}
return filter(function (data) {
var key = keyfn(data);
if (keyStore.has(key)) {
return false;
}
keyStore.add(key);
return true;
});
}