Source: https://info.usherbrooke.ca/informatique/cours/automne2016/a16-plans-de-cours/ift159_2016-3_pdc.pdf