Category Theory of Programming Languages