Skip to content

Instantly share code, notes, and snippets.

Raúl Raja Martínez raulraja

View GitHub Profile
@raulraja
raulraja / Global.scala
Created August 19, 2013 16:29
Load application.conf overrides based on runtime environment and merge in overridden props. e.g. application.dev.conf, application.prod.conf, application.test.conf
package com.company
import play.api.{Mode, Configuration, GlobalSettings}
import java.io.File
import com.typesafe.config.ConfigFactory
object Global extends GlobalSettings {
override def onLoadConfig(config: Configuration, path: File, classloader: ClassLoader, mode: Mode.Mode): Configuration = {
println(s"loading config path: $path")
@raulraja
raulraja / Either.java
Created October 22, 2015 11:03
A right biased disjoint union in Java with useful functional combinators.
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
/**
* A right biased disjoint union in Java with useful functional combinators.
*
@raulraja
raulraja / SearchService.scala
Created January 26, 2016 23:25
An example of refactoring nested login in the Ensime Search Service with `XorT`
import cats.data.Xor, cats.syntax.xor._, cats.data.XorT
//Some type aliases for semantic purposes
type IndexedSymbols = Iterable[(FileObject, List[FqnSymbol])]
type IndexingError = (String, Throwable)
type ProcessResult[A] = XorT[Future, IndexingError, A]
@raulraja
raulraja / KleisliLocalShaped.sc
Created February 10, 2016 22:58
Shapeless autolifting Kleisli#local to avoid lambda boilerplate
import cats._
import cats.data._
import shapeless._
import shapeless.ops.hlist.Selector
implicit class ReaderOps[A, B, L <: HList](f: Reader[A, B]) {
def liftD[AA](implicit ga: Generic.Aux[AA, L], sel: Selector[L, A]): Reader[AA, B] =
f.local[AA](aa => sel.apply(ga.to(aa)))
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverlappingInstances #-}
module Main where
import Control.Monad.Free
@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
@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 / 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 / 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 / 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 */