| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 | var Stream = require('stream');function prop(propName) {  return function (data) {    return data[propName];  };}module.exports = unique;function unique(propName) {  var keyfn = JSON.stringify;  if (typeof propName === 'string') {    keyfn = prop(propName);  } else if (typeof propName === 'function') {    keyfn = propName;  }  var seen = {};  var s = new Stream();  s.readable = true;  s.writable = true;  var pipes = 0;  s.write = function (data) {    var key = keyfn(data);    if (seen[key] === undefined) {      seen[key] = true;      s.emit('data', data);    }  };  var ended = 0;  s.end = function (data) {    if (arguments.length) s.write(data);    ended++;    if (ended === pipes || pipes === 0) {      s.writable = false;      s.emit('end');    }  };  s.destroy = function (data) {    s.writable = false;  };  s.on('pipe', function () {    pipes++;  });  s.on('unpipe', function () {    pipes--;  });  return s;}
 |