All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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 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 - 2024 Weber Informatics LLC | Privacy Policy