More functional, idiomatic and monadic, less code

An alternative approach can use Option.filter and Option.isDefined.

Notice that it's still lazy, but avoids return expressions.