Skip to content

Instantly share code, notes, and snippets.

@raulraja
raulraja / ArrowTrial.kt
Last active January 6, 2019 19:16 — forked from bjonnh/ArrowTrial.kt
How to run suspend function in Arrow IOs
import arrow.core.left
import arrow.core.right
import arrow.effects.IO
import arrow.effects.extensions.io.applicativeError.handleErrorWith
import arrow.effects.extensions.io.monad.binding
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
import java.time.LocalDateTime
@raulraja
raulraja / refinement.kt
Last active November 9, 2018 11:18
Type Refinement with Type Classes and ApplicativeError
package arrow.refined
import arrow.Kind
import arrow.core.*
import arrow.data.*
import arrow.effects.validated.positiveInt.plus
import arrow.effects.validated.positiveInt.positive
import arrow.extension
import arrow.instances.either.applicativeError.applicativeError
import arrow.instances.listk.traverse.traverse
@raulraja
raulraja / typeclassless_tagless_extensions.kt
Last active June 17, 2018 12:43
Tagless with Arrow & typeclassless using extension functions and instances
import arrow.Kind
import arrow.core.Option
import arrow.core.Try
import arrow.core.functor
import arrow.effects.IO
import arrow.effects.fix
import arrow.effects.functor
import arrow.typeclasses.Functor
/* algebras */
@raulraja
raulraja / dstagless.kt
Last active December 15, 2018 01:23
Tagless data source strategies with Arrow
import arrow.Kind
import arrow.core.Option
import arrow.core.left
import arrow.core.right
import arrow.effects.typeclasses.Async
import arrow.typeclasses.ApplicativeError
data class UserId(val value: String)
data class User(val userId: UserId)
data class Task(val value: String)
@raulraja
raulraja / validation.kt
Last active May 9, 2019 08:25
Validation: Accumulating errors and failing fast in Arrow with `ApplicativeError`
import arrow.*
import arrow.core.*
import arrow.typeclasses.*
import arrow.data.*
sealed class ValidationError(val msg: String)
data class DoesNotContain(val value: String) : ValidationError("Did not contain $value")
data class MaxLength(val value: Int) : ValidationError("Exceeded length of $value")
data class NotAnEmail(val reasons: Nel<ValidationError>) : ValidationError("Not a valid email")
@raulraja
raulraja / Tagless.kt
Last active January 20, 2020 15:53
Tagless in Kotlin with Arrow and manual DI
import arrow.Kind
import arrow.core.Option
import arrow.core.Try
import arrow.core.functor
import arrow.effects.IO
import arrow.effects.fix
import arrow.effects.functor
import arrow.typeclasses.Functor
/* algebras */
@raulraja
raulraja / gist:9267f5c98c92eafe5b2abbf1d22027d8
Created September 30, 2016 11:42
Scala Exercises - LambdaWorld Scala Center Hackathon
https://github.com/scala-exercises/exercises-circe/issues/1
https://github.com/scala-exercises/exercises-stdlib/issues/4
https://github.com/scala-exercises/exercises-scalacheck/issues/16
https://github.com/scala-exercises/exercises-scalacheck/issues/8
https://github.com/scala-exercises/exercises-circe/issues/5
https://github.com/scala-exercises/exercises-circe/issues/4
https://github.com/scala-exercises/exercises-circe/issues/1
https://github.com/scala-exercises/scala-exercises/issues/452
@raulraja
raulraja / errors.scala
Created September 28, 2016 11:07
Sane Error Handling
import cats.data.{Xor, XorT}
import monix.eval.Task
import cats.implicits._
import scala.util.control.NonFatal
/**
* Biz Errors and Exceptions are two separate things.
* Biz errors are valid business cases that should not be modeled in the `Throwable` hierarchy.
* They are models.
@raulraja
raulraja / increase_performance_attempt.scala
Created September 5, 2016 13:49
Wrong order of effects
import scala.concurrent.ExecutionContext.global
val af = fetchUserInfoService(userId)
val bf = simpleDbLookups
val cf = expensiveDbLookups
val df = dbWriteOperations
val ef = expensiveCpuOperations
for {
a <- af
@raulraja
raulraja / ecpitfalls.scala
Last active September 10, 2016 08:07
Wrong Execution Context passed to all ops in the same way via flatMap
import scala.concurrent.ExecutionContext.global
for {
a <- nonBlocking
b <- simpleDbLookups
c <- expensiveDbLookups
d <- dbWriteOperations
e <- expensiveCpuOperations
} yield result