http://aperiodic.net/phil/scala/s-99/ [1-5]