Rewritten in a more fonctionnal way.