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

japgolly.scalajs.react.util.OptionLike.scala Maven / Gradle / Ivy

The newest version!
package japgolly.scalajs.react.util

import scala.scalajs.js

trait OptionLike[O[_]] {
  def map     [A, B](o: O[A])(f: A => B)         : O[B]
  def fold    [A, B](o: O[A], b: => B)(f: A => B): B
  def foreach [A]   (o: O[A])(f: A => Unit)      : Unit
  def isEmpty [A]   (o: O[A])                    : Boolean
  def toOption[A]   (o: O[A])                    : Option[A]

  /** This is "unsafe" because it can't represent `Some(())`. Use with care. */
  def unsafeToJs[A](o: O[A]): js.UndefOr[A]
}

//sealed trait OptionLikeLowPri {
//  Hmmmm....
//  implicit lazy val someInstance: OptionLike[Some] = new OptionLike[Some] {
//    type O[A] = Some[A]
//    def map     [A, B](o: O[A])(f: A => B)         : O[B]    = Some(f(o.value))
//    def fold    [A, B](o: O[A], b: => B)(f: A => B): B       = f(o.value)
//    def foreach [A]   (o: O[A])(f: A => Unit)      : Unit    = f(o.value)
//    def isEmpty [A]   (o: O[A])                    : Boolean = false
//    def toOption[A]   (o: O[A])                    : Some[A] = o
//  }
//}

object OptionLike {
  implicit val optionInstance: OptionLike[Option] = new OptionLike[Option] {
    type O[A] = Option[A]
    override def map       [A, B](o: O[A])(f: A => B)          = o map f
    override def fold      [A, B](o: O[A], b: => B)(f: A => B) = o.fold(b)(f)
    override def foreach   [A]   (o: O[A])(f: A => Unit)       = o foreach f
    override def isEmpty   [A]   (o: O[A])                     = o.isEmpty
    override def toOption  [A]   (o: O[A])                     = o
    override def unsafeToJs[A]   (o: O[A])                     = if (o.isEmpty) js.undefined else o.get
  }

  implicit val jsUndefOrInstance: OptionLike[js.UndefOr] = new OptionLike[js.UndefOr] {
    type O[A] = js.UndefOr[A]
    override def map       [A, B](o: O[A])(f: A => B)          = o map f
    override def fold      [A, B](o: O[A], b: => B)(f: A => B) = o.fold(b)(f)
    override def foreach   [A]   (o: O[A])(f: A => Unit)       = o foreach f
    override def isEmpty   [A]   (o: O[A])                     = o.isEmpty
    override def toOption  [A]   (o: O[A])                     = o.toOption
    override def unsafeToJs[A]   (o: O[A])                     = o
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy