org.scalactic.OptionSugar.scala Maven / Gradle / Ivy
The newest version!
/*
* 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 Option
s 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 Or
s,
* 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 - 2024 Weber Informatics LLC | Privacy Policy