Skip to content

Instantly share code, notes, and snippets.

View kubukoz's full-sized avatar
😱
I might take a week to respond. Or a month.

Jakub Kozłowski kubukoz

😱
I might take a week to respond. Or a month.
View GitHub Profile
@kubukoz
kubukoz / post.scala
Created May 16, 2018 13:10
the description for this gist
val time: Future[Long] = Future { System.currentTimeMillis() }
for {
t1 <- time
x = calculateSomething(args)
t2 <- time
} println(t2 - t1)
@kubukoz
kubukoz / post.scala
Created May 16, 2018 13:10
the description for this gist
val time: Task[Long] = Task { System.currentTimeMillis() }
for {
t1 <- time
x = calculateSomething(args)
t2 <- time
} println(t2 - t1)
@kubukoz
kubukoz / post.scala
Created May 16, 2018 13:10
the description for this gist
class Calc[F[_] : Sync] {
def calculateSomething(args: List[String]): Int = ???
def measureCalculation(args: List[String]): F[(Int, Long)] = {
val time: F[Long] = Sync[F].delay { System.currentTimeMillis() }
for {
t1 <- time
x = calculateSomething(args)
t2 <- time
@kubukoz
kubukoz / post.scala
Created May 16, 2018 13:10
the description for this gist
def checkAndSave(event: PageViewed,
hostname: String,
clientIp: Option[String]): F[ValidatedNel[PVError, Unit]]
@kubukoz
kubukoz / post.scala
Created May 16, 2018 13:10
the description for this gist
sealed trait PVError extends Product with Serializable
object PVError {
case object NoIp extends PVError
case object AlreadyTracked extends PVError
case object PageNotFound extends PVError
case object InvalidTimestamp extends PVError
//helper functions to upcast easily
val noIp: PVError = NoIp
@kubukoz
kubukoz / post.scala
Created May 16, 2018 13:10
the description for this gist
def checkAndSave(event: PageViewed,
hostname: String,
clientIp: Option[String]): F[ValidatedNel[PVError, Unit]] = {
val normalizedPath = normalize(event.path)
val uuidF: F[UUID] = Sync[F].delay { UUID.randomUUID() }
val currentTimeF: F[OffsetDateTime] = getCurrentTimeF
val ipValidationF: F[ValidatedNel[PVError, String]] =
clientIp
@kubukoz
kubukoz / post.scala
Created May 16, 2018 13:10
the description for this gist
val ipValidationF: F[ValidatedNel[PVError, String]] =
clientIp
.toValidNel(PVError.noIp)
.traverse(checkIp(_, hostname, normalizedPath))
.map(_.andThen(identity)
@kubukoz
kubukoz / post.scala
Created May 16, 2018 13:10
the description for this gist
val pathValidationF: F[ValidatedNel[PVError, String]] =
pageExists(hostname, normalizedPath).map(
Validated.condNel(_, normalizedPath, PVError.pageNotFound))
@kubukoz
kubukoz / post.scala
Created May 16, 2018 13:10
the description for this gist
(uuidF, currentTimeF, ipValidationF, pathValidationF).traverseN {
(uuid, currentTime, ipValidation, pathValidation) => ...
}
@kubukoz
kubukoz / post.scala
Created May 16, 2018 13:10
the description for this gist
val timestampV: ValidatedNel[PVError, OffsetDateTime] = event
.displayedAt
.valid
.ensure(PVError.invalidTimestamp)(_.isBefore(currentTime))
.toValidatedNel
(
uuid.valid,
pathValidation,
timestampV,