I've found this pattern quite a few times in my code:
if (doIt)
object.callAMethod
else
object
I'm wondering if there could be a syntactically more pleasing way to write the code above, especially to avoid the repetition of the object
variable. Something like:
// using the Scalaz "pipe" operator
// and "pimping" f: T => T with a `when` method
object |> (_.callAMethod).when(doIt)
Unfortunately the line above fails because the type inference requires a parameter type for (_.callAMethod)
.
My best approach for now is this:
implicit def doItOptionally[T](t: =>T) = new DoItOptionally(t)
class DoItOptionally[T](t: =>T) {
def ?>(f: T => T)(implicit doIt: Boolean = true) =
if (doIt) f(t) else t
}
implicit val doIt = true
object ?> (_.callAMethod)
Not great because I have to declare an implicit val
but this pays off if there are several chained calls:
object ?> (_.callAMethod) ?> (_.callAnotherMethod)
Does anyone have a better idea? Am I missing some Scalaz magic here?