should this be `def ack(fn: (T => U)): Option[U]`? Seems like we might want a return in many cases.