Skip to content

Instantly share code, notes, and snippets.

@Ghurtchu
Created August 10, 2022 11:11
Show Gist options
  • Save Ghurtchu/169b9bcb8601b998996dad9f19309489 to your computer and use it in GitHub Desktop.
Save Ghurtchu/169b9bcb8601b998996dad9f19309489 to your computer and use it in GitHub Desktop.
is it Option? Maybe!..
object MaybeImpl extends scala.App {
sealed trait Maybe[+A] {
def get: A
def map[B >: A](f: A => B): Maybe[B]
def flatMap[B >: A](f: A => Maybe[B]): Maybe[B]
def filter(p: A => Boolean): Maybe[A]
def isEmpty: Boolean
def fold[B](ifEmpty: => B)(f: A => B): B
}
object Maybe {
def spawn[A](value: A): Maybe[A] = Exists(value)
def none: Maybe[Nothing] = Void
}
case class Exists[A](value: A) extends Maybe[A] {
override def get: A = value
override def map[B >: A](f: A => B): Maybe[B] = Maybe.spawn(f(value))
override def flatMap[B >: A](f: A => Maybe[B]): Maybe[B] = f(value)
override def filter(p: A => Boolean): Maybe[A] = if (p(value)) this else Maybe.none
override def isEmpty: Boolean = false
override def fold[B](ifEmpty: => B)(f: A => B): B = f(value)
}
case object Void extends Maybe[Nothing] {
override def get: Nothing = throw new NoSuchElementException("Void")
override def map[B >: Nothing](f: Nothing => B): Maybe[B] = this
override def flatMap[B >: Nothing](f: Nothing => Maybe[B]): Maybe[B] = this
override def filter(p: Nothing => Boolean): Maybe[Nothing] = this
override def isEmpty: Boolean = true
override def fold[B](ifEmpty: => B)(f: Nothing => B): B = ifEmpty
}
val result = for {
num1 <- Maybe.spawn(5)
num2 <- Maybe.spawn(num1 + 15)
num3 <- Maybe.spawn(num2).filter(_ % 2 == 0)
num4 <- Maybe.spawn(Maybe.spawn(num3).fold(0)(v => v * v))
} yield num4
println("assertion..")
assert(result == Exists(400))
println("went fine!")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment