Skip to content

Instantly share code, notes, and snippets.

View dkomanov's full-sized avatar

Dmitry Komanov dkomanov

View GitHub Profile
@dkomanov
dkomanov / ForComprehensions6.scala
Created May 22, 2020 22:18
[writing-async-app-in-scala-part-1] for-comprehensions 6
implicit class FutureExtensions[T](val future: Future[T]) extends AnyVal {
def filterOrFail(f: T => Boolean, e: => Throwable): Future[T] =
future.flatMap(value => if (f(value)) Future.successful(value) else Future.failed(e))
}
@dkomanov
dkomanov / ForComprehensions5.scala
Created May 22, 2020 22:17
[writing-async-app-in-scala-part-1] for-comprehensions 5
movie <- getMovie.filter(!_.hidden).recoverWith {
case _: NoSuchElementException => Future.failed(new HiddenMovieException("..."))
}
@dkomanov
dkomanov / ForComprehensions4.scala
Created May 22, 2020 22:17
[writing-async-app-in-scala-part-1] for-comprehensions 4
for {
_ <- hasPermissions orFail new PermissionDeniedException("...")
movie <- getMovie
if !movie.hidden
actors <- getActors(movie)
plot <- getPlot(movie)
} yield MovieDescription(movie, actors, plot)
@dkomanov
dkomanov / ForComprehensions3.scala
Created May 22, 2020 22:16
[writing-async-app-in-scala-part-1] for-comprehensions 3
implicit class BooleanFutureExtensions(val future: Future[Boolean]) extends AnyVal {
def orFail(e: => Throwable): Future[Boolean] =
future.transform(t => if (t.isSuccess && !t.get) Failure(e) else t)
}
@dkomanov
dkomanov / ForComprehensions2.scala
Created May 22, 2020 22:14
[writing-async-app-in-scala-part-1] for-comprehensions 2
def hasPermissions: Future[Boolean]
for {
isPermitted <- hasPermissions
if isPermitted
movie <- getMovie
if !movie.hidden
actors <- getActors(movie)
plot <- getPlot(movie)
} yield MovieDescription(movie, actors, plot)
@dkomanov
dkomanov / ForComprehensions1.scala
Created May 22, 2020 22:14
[writing-async-app-in-scala-part-1] for-comprehensions 1
def getMovie: Future[Movie]
def getActors(movie: Movie): Future[Seq[Actor]]
def getPlot(movie: Movie): Future[MoviePlot]
for {
movie <- getMovie
actors <- getActors(movie)
plot <- getPlot(movie)
} yield MovieDescription(movie, actors, plot)
@dkomanov
dkomanov / BooleanOps3.scala
Created May 22, 2020 22:09
[writing-async-app-in-scala-part-1] BooleanOps3
implicit class FutureOfBooleanExtensions(val future: Future[Boolean]) extends AnyVal {
def &&(other: => BooleanOrFutureOfBoolean): Future[Boolean] =
v.flatMap(
if (_)
other match {
case Bool(otherValue) => Future.successful(otherValue)
case Fut(future) => future
}
else
Future.successful(false)
@dkomanov
dkomanov / IfElseAsyncMultipleOps2.scala
Created May 22, 2020 22:02
[writing-async-app-in-scala-part-1] multiple statements mixed Boolean and Future[Boolean]
def condition1: Boolean = ...
def condition2: Boolean = ...
def condition3: Future[Boolean] = ...
val condition = condition1 && (condition2 || condition3)
condition.flatMap(
if (_)
...
else
...
@dkomanov
dkomanov / BooleanOps2.scala
Created May 22, 2020 22:00
[writing-async-app-in-scala-part-1] BooleanOps2
implicit class BooleanToFutureExtensions(val v: Boolean) extends AnyVal {
def &&(other: => Future[Boolean]): Future[Boolean] =
if (v) other else Future.successful(false)
def ||(other: => Future[Boolean]): Future[Boolean] =
if (v) Future.successful(true) else other
}
@dkomanov
dkomanov / IfElseAsyncMultipleOps.scala
Created May 22, 2020 21:59
[writing-async-app-in-scala-part-1] multiple statement
def condition1: Future[Boolean] = ...
def condition2: Future[Boolean] = ...
def condition3: Future[Boolean] = ...
val condition = condition1 && (condition2 || condition3)
condition.flatMap(
if (_)
...
else
...