| 'use strict'; |
| |
| var value = require('../../object/valid-value') |
| , aFrom = require('../from') |
| , toArray = require('../to-array') |
| , contains = require('./contains') |
| , byLength = require('./_compare-by-length') |
| |
| , filter = Array.prototype.filter, push = Array.prototype.push; |
| |
| module.exports = function (/*…lists*/) { |
| var lists, seen, result; |
| if (!arguments.length) return aFrom(this); |
| push.apply(lists = [this], arguments); |
| lists.forEach(value); |
| seen = []; |
| result = []; |
| lists.sort(byLength).forEach(function (list) { |
| result = result.filter(function (item) { |
| return !contains.call(list, item); |
| }).concat(filter.call(list, function (x) { |
| return !contains.call(seen, x); |
| })); |
| push.apply(seen, toArray(list)); |
| }); |
| return result; |
| }; |