Source: http://www.cs.tau.ac.il/~msagiv/courses/pl14/scala.pdf