Source: http://artax.karlin.mff.cuni.cz/~konim5am/Scala/Scala.pdf