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

epic.util.Optional.scala Maven / Gradle / Ivy

The newest version!
package epic.util

/**
 * Optional is just like [[scala.Option]], except that we offer implicit
 * conversion from the Optional to Provided. Mostly for use in optional argument lists
 * @author dlwh
 */
sealed trait Optional[+A] {
  def iterator: Iterator[A] = this match {
    case Provided(a) => Iterator(a)
    case NotProvided => Iterator.empty
  }

  def get: A
  def isEmpty: Boolean = this eq NotProvided
  def size : Int = if(isEmpty) 0 else 1

  def map[B](f: A=>B): Optional[B] = this match {
    case Provided(x) => Provided(f(x))
    case NotProvided => NotProvided
  }

  def flatMap[B](f: A=>Optional[B]) = this match {
    case Provided(x) => f(x)
    case NotProvided => NotProvided
  }


  def foreach[B](f: A=>B) {
    this match {
      case Provided(x) => f(x)
      case _ =>
    }
  }

  def foldLeft[B](b:B)(f: (B,A) => B) = if(isEmpty) b else f(b, get)

  def fold[B](ifSome: A => B , ifNone: => B) = if(isEmpty) ifNone else ifSome(get)

  def getOrElse[B>:A](ifNone: => B) = if(isEmpty) ifNone else get
}

/**
 * Equivalent to Some, but with an implicit conversion
 * from A to Provided(aA
 * @param get
 * @tparam A
 */
case class Provided[+A](get: A) extends Optional[A] {
}

/**
 * Equivalent to None
 */
@SerialVersionUID(-649101350749082174L)
case object NotProvided extends Optional[Nothing] {
  def get = throw new NoSuchElementException("NotProvided.get")
}


object Optional extends LowPriorityOptionalImplicit {
  implicit def liftOption[A](o: Option[A]) = o match {
    case Some(a) => Provided(a)
    case None => NotProvided
  }

}

sealed trait LowPriorityOptionalImplicit {
  implicit def liftAnything[A](a: A) = if(a == null) NotProvided else Provided(a)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy