Skip to content

Instantly share code, notes, and snippets.

View dkomanov's full-sized avatar

Dmitry Komanov dkomanov

View GitHub Profile
@dkomanov
dkomanov / BooleanOps1.scala
Created May 22, 2020 21:58
[writing-async-app-in-scala-part-1] BooleanOps1
implicit class FutureOfBooleanExtensions(val future: Future[Boolean]) extends AnyVal {
def &&(other: => Future[Boolean]): Future[Boolean] =
future.flatMap(value => if (!value) Future.successful(false) else other)
def ||(other: => Future[Boolean]): Future[Boolean] =
future.flatMap(value => if (value) Future.successful(true) else other)
}
@dkomanov
dkomanov / IfElseMultipleConditions.scala
Created May 22, 2020 21:57
[writing-async-app-in-scala-part-1] multiple statement
def condition1: Boolean = ...
def condition2: Boolean = ...
def condition3: Boolean = ...
if (condition1 && (condition2 || condition3)) ...
@dkomanov
dkomanov / IfElseAsync.scala
Created May 22, 2020 21:55
[writing-async-app-in-scala-part-1] async if-statement
def condition: Future[Boolean] = ...
def action1(): Future[Unit] = ...
def action2(): Future[Unit] = ...
condition.flatMap(
if (_)
action1()
else
action2()
@dkomanov
dkomanov / IfElseSync.scala
Created May 22, 2020 21:54
[writing-async-app-in-scala-part-1] sync if-statement
def condition: Boolean = ...
def action1(): Unit = ...
def action2(): Unit = ...
if (condition) {
action1()
} else {
action2()
}
@dkomanov
dkomanov / NaiveRewriteToAsync.scala
Created May 22, 2020 21:52
[writing-async-app-in-scala-part-1] naive rewrite to async
def regularRpcEndpoint(request: Request): Future[Response] = {
validateRequest(request)
isPermittedViaRpc.flatMap { isPermitted =>
if (!isPermitted) {
Future.failed(new PermissionDeniedException("..."))
} else {
retrieveFromDatabase(request.id)
.map(convertPayloadFromDb)
.map(Response)
@dkomanov
dkomanov / RegularSyncWebApplication.scala
Last active May 22, 2020 21:46
[writing-async-app-in-scala-part-1] regular sync web application example
def validateRequest(request: Request): Unit = {
require(request != null)
}
def regularRpcEndpoint(request: Request): Response = {
validateRequest(request)
if (!isPermittedViaRpc) {
throw new PermissionDeniedException("...")
}
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.infra.Blackhole;
import java.util.ArrayList;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
@State(Scope.Benchmark)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@dkomanov
dkomanov / package.scala
Created January 9, 2016 18:32
[scala] result code: either with some implicits 2
import scala.language.implicitConversions
import scala.util.Try
package object business {
implicit final class ModelOrResultFromOption[M](private val opt: Option[M])
extends AnyVal {
// converts Option to Either.RightProjection
def orResult[R](result: => R) =
opt.fold[Either[R, M]](Left(result))(Right(_)).right
@dkomanov
dkomanov / processRequestNew.scala
Created January 9, 2016 18:31
[scala] result code: either with some implicits
def processRequestNew(userId: UUID, requestId: UUID): BusinessResult = {
for {
user <- getUser(userId) orResult BusinessResult.UserNotFound
request <- getRequestById(requestId) orResult BusinessResult.RequestNotFound
_ <- checkAccess(request, user) orResult BusinessResult.NotOwner
} yield BusinessResult.Ok
}
@dkomanov
dkomanov / processRequestEither.scala
Created January 9, 2016 18:24
[scala] result code: either
def processRequestEither(userId: UUID, requestId: UUID): BusinessResult = {
val result: Either[BusinessResult, BusinessResult] = for {
user <- either(getUser(userId), BusinessResult.UserNotFound)
request <- either(getRequestById(requestId), BusinessResult.RequestNotFound)
_ <- either(checkAccess(request, user).toOption, BusinessResult.NotOwner)
} yield BusinessResult.Ok
result.fold(identity, identity)
}