fun with bifunctors