update ReadDirection: use sealed trait & case objects