| '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; |
| }); |
| } |