scala coalescing

¿Cómo escribir un operador coalescente seguro a prueba de cero en Scala?



coalescing (1)

Al igual que:

case class ?:[T](x: T) { def apply(): T = x def apply[U >: Null](f: T => U): ?:[U] = if (x == null) ?:[U](null) else ?:[U](f(x)) }

Y en acción:

scala> val x = ?:("hel")(_ + "lo ")(_ * 2)(_ + "world")() x: java.lang.String = hello hello world scala> val x = ?:("hel")(_ + "lo ")(_ => (null: String))(_ + "world")() x: java.lang.String = null

Habiendo visto las respuestas que surgen de preguntas como esta que involucran horror, como tratar de atrapar el NPE y sacar el nombre destrozado del rastro de la pila, estoy haciendo esta pregunta para poder responderla.

Comentarios o mejoras adicionales bienvenidos.