Source: http://people.cs.bris.ac.uk/~ian/COMS10008/lectures/io/io.pdf