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

diode.Monad.scala Maven / Gradle / Ivy

The newest version!
package diode

import scala.language.higherKinds

/**
  * Defines a Diode specific Monad for traversing models with `Option`s etc.
  */
trait Monad[F[_]] {
  /**
    * Maps a monad value to another value using function `f`
    */
  def map[A, B](fa: F[A])(f: A => B): F[B]

  /**
    * Maps a monad value to another monad using function `f`
    */
  def flatMap[A, B](fa: F[A])(f: A => F[B]): F[B]

  /**
    * Checks if the contents of two monads are equal
    */
  def isEqual[A](fa1: F[A], fa2: F[A])(eqF: (A, A) => Boolean): Boolean
}

object Monad {

  /**
    * Monad type class for `Option`
    */
  implicit object optionMonad extends Monad[Option] {
    override def map[A, B](fa: Option[A])(f: A => B): Option[B] =
      fa.map(f)

    override def flatMap[A, B](fa: Option[A])(f: A => Option[B]): Option[B] =
      fa.flatMap(f)

    override def isEqual[A](fa1: Option[A], fa2: Option[A])(eqF: (A, A) => Boolean): Boolean = {
      (fa1, fa2) match {
        case (Some(a1), Some(a2)) => eqF(a1, a2)
        case (None, None) => true
        case _ => false
      }
    }
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy