| "use strict" |
| |
| function unique_pred(list, compare) { |
| var ptr = 1 |
| , len = list.length |
| , a=list[0], b=list[0] |
| for(var i=1; i<len; ++i) { |
| b = a |
| a = list[i] |
| if(compare(a, b)) { |
| if(i === ptr) { |
| ptr++ |
| continue |
| } |
| list[ptr++] = a |
| } |
| } |
| list.length = ptr |
| return list |
| } |
| |
| function unique_eq(list) { |
| var ptr = 1 |
| , len = list.length |
| , a=list[0], b = list[0] |
| for(var i=1; i<len; ++i, b=a) { |
| b = a |
| a = list[i] |
| if(a !== b) { |
| if(i === ptr) { |
| ptr++ |
| continue |
| } |
| list[ptr++] = a |
| } |
| } |
| list.length = ptr |
| return list |
| } |
| |
| function unique(list, compare, sorted) { |
| if(list.length === 0) { |
| return list |
| } |
| if(compare) { |
| if(!sorted) { |
| list.sort(compare) |
| } |
| return unique_pred(list, compare) |
| } |
| if(!sorted) { |
| list.sort() |
| } |
| return unique_eq(list) |
| } |
| |
| module.exports = unique |