# Solution to 99 lisp problems: P08, with functional javascript

If a list contains repeated elements they should be replaced with a single copy of the element. The order of the elements should not be changed.

* (compress '(a a a a b c c a a d e e e e))
(A B C A D E)


Anyone want to review?

function cond( check, _then, _continuation ) {
if(check) return _then( _continuation )
else return _continuation()
}

function compress( list ) {
return (function check( index, item, nextItem, compressed ) {
return cond( item !== nextItem, function _then( continuation ) {
compressed = compressed.concat([ item ])
return continuation()
},
function _continueation() {
return cond(!nextItem, function _then() {
return compressed
},
function _continuation() {
return check( index + 1, list[index + 1], list[index + 2], compressed )
})
})
})( 0, list[0], list[1], [] )
}

• Wouldn't a loop or recursive calling be a better idea? Commented Jul 23, 2012 at 5:19
• The cond function can probably be replaced with a ternary operator and switching the order a little. Commented Jul 23, 2012 at 5:20

I don't think you need so much complexity in javascript. It's not a fully functional language, don't try to make it so.

var arr = [
'a', 'a', 'a', 'b', 'b', 'c', 'd', 'd', 'a', 'e', 'e', 'e'
];

arr = arr.filter( function( el, i ) {
// return if the current isn't the same as the next
return el !== arr[ i + 1 ];
});

console.log( arr ); // ["a", "b", "c", "d", "a", "e"]


This is 2 lines.

• The function passed to filter can be generalized by adding a third parameter arr. Commented Jul 26, 2012 at 1:10