Categories, Types, and Structures: An Introduction to Category Theory for the Working Computer Scientist