org.scalactic.OptionSugar.scala Maven / Gradle / Ivy
/*
* Copyright 2001-2013 Artima, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.scalactic
/**
* Trait providing an implicit class that adds a toOr method to
* Option, which converts Some to Good,
* None to Bad.
*
*
* You can use the toOr method to record information about why
* a processing of nested Options resulted in None.
* For example, the following for expression results in
* None if either the passed optional Person is
* None or else if the contained optional age is None:
*
*
*
* scala> case class Person(name: String, age: Option[Int])
* defined class Person
*
* scala> def ageOf(person: Option[Person]) =
| for {
| per <- person
| age <- per.age
| } yield age
* ageOf: (person: Option[Person])Option[Int]
*
* scala> ageOf(Some(Person("Ralph", Some(32))))
* res0: Option[Int] = Some(32)
*
* scala> ageOf(Some(Person("Curt", None)))
* res3: Option[Int] = None
*
* scala> ageOf(None)
* res2: Option[Int] = None
*
*
*
* If you instead populate the for expression with Ors,
* supplying an error message or other "bad" value to the toOr method
* in case of None, you'll get an indication of which part
* failed if a None is encountered:
*
*
*
* scala> import OptionSugar._
* import OptionSugar._
*
* scala> def ageOf(person: Option[Person]) =
* | for {
* | per <- person toOr "no person here"
* | age <- per.age toOr "ageless person"
* | } yield age
* ageOf: (person: Option[Person])org.scalactic.Or[Int,String]
*
* scala> ageOf(Some(Person("Ralph", Some(32))))
* res1: org.scalactic.Or[Int,String] = Good(32)
*
* scala> ageOf(Some(Person("Curt", None)))
* res2: org.scalactic.Or[Int,String] = Bad(ageless person)
*
* scala> ageOf(None)
* res3: org.scalactic.Or[Int,String] = Bad(no person here)
*
*/
trait OptionSugar {
/**
* Implicit class that adds a toOr method to
* Option, which converts Some to Good,
* None to Bad.
*/
implicit class Optionizer[G](option: Option[G]) {
/**
* Converts the wrapped Option to an Or.
*/
def toOr[B](orElse: => B): G Or B = Or.from(option, orElse)
}
}
/**
* Companion object for OptionSugar enabling its members to be
* imported as an alternative to mixing them in.
*/
object OptionSugar extends OptionSugar
© 2015 - 2025 Weber Informatics LLC | Privacy Policy