Stack

Http4s + Circe + Doobie

Alejandra Holman | Diego Parra | Cristian Spinetta

Agenda

 

  • Por qué programación funcional?

  • Doobie

  • Circe

  • Http4s - Server & Client

 

Programación Funcional

"As software becomes more and more complex, it is more and more important to structure it well. Well-structured software is easy to write and to debug, and provides a collection of modules that can be reused to reduce future programming costs. In this paper we show that two features of functional languages in particular, higher-order functions and lazy evaluation, can contribute significantly to modularity ... We conclude that since modularity is the key to successful programming, functional programming offers important advantages for software development."

 

Why Functional Programming Matters?, by John Hughes

  • Funciones casi puras

    • No hay side-effect

    • Fácil de componer y reutilizar

    • Fácil de razonar: Substitution Model

    • Refactor y Testing más simples

    • Lazy evaluation / Memoize

    • Concurrencia más simple

  • Descripción => Interpretación

Programación Funcional

Puntos interesantes:

  • Curva de aprendizaje
  • Madurez de libs/frameworks

Warning:

Programación Funcional

Side-Effect

Modificar algún estado externo de la unidad de ejecución

Cualquier operación de una función, que no sea trabajar con sus argumentos y devolver un resultado

  • Lanzar excepción
  • Operación de IO
  • Query en la Base
  • ...

Effect

Tipo de Dato con funcionalidad extra

  • Option -> Hay valor | No
  • Future -> Pendiente | Finalizó OK | Finalizó con Error
  • ...

Transparencia referencial

Programación funcional

Programación Funcional

... ¿Cómo generamos efectos en el "mundo real"???

¿Cómo nos conectamos a la Base?

¿Cómo consumimos un servicio?

¿Cómo programamos sin side-effect's?

Programación Funcional

Descripción

Interpretación

Operaciones como Valores:

Ejemplo: Conversor decimal a binario por consola

Programación Funcional

Descripción del programa:

Descripción

Interpretación

Programación Funcional

Un intérprete posible:

Otro intérprete:

Descripción

Interpretación

Programación Funcional

Ejecutando el programa:

Descripción

Interpretación

Doobie

Doobie

"A pure functional JDBC layer for Scala. It is not an ORM, nor is it a relational algebra; it simply provides a principled way to construct programs (and higher-level libraries) that use JDBC."

https://github.com/tpolecat/doobie

 

 

libraryDependencies ++= Seq(
   "org.tpolecat" %% "doobie-core" % "0.5.0"
)

Programs as values: JDBC Programming with Doobie, by Rob Norris: https://www.youtube.com/watch?v=M5MF6M7FHPo

Transactor

Query: definition & execution

Magic mapping!

Custom mapping...

Fragments

Updates

DML

Inserts

Batch operation

Transactions

Error handling

Logging

  • Transacciones

  • Logging de queries y tiempos

  • Queries dinámicas

  • YOLO mode

  • Documentación y soporte

  • Streaming

  • Mapping arduo para algunas queries

  • No soporta timeout por query

Pros & Cons

Circe

Circe

 

"Circe is a Json library for Scala powered by Cats"

https://circe.github.io/circe

 

 

libraryDependencies ++= Seq(
   "io.circe" %% "circe-generic"        % "0.8.0",
  "io.circe" %% "circe-java8"          % "0.8.0",
   "io.circe" %% "circe-generic-extras" % "0.8.0"
)

Encoder & Decoder semiauto

asJson =>

Encoder & Decoder custom

asJson =>

Unsupported types

asJson =>

Snake case

asJson =>

  • Serialización / Deserialización de case classes trivial

  • Soporta encoders / decoders custom

  • Integración con Http4s

  • Full auto derivation experimental

Pros & Cons

Http4s

Http4s

 

"Typeful, functional, streaming HTTP for Scala"

http://http4s.org

 

 

libraryDependencies ++= Seq(
   "org.http4s" %% "http4s-blaze-server" % "0.18.0",
   "org.http4s" %% "http4s-blaze-client" % "0.18.0",
   "org.http4s" %% "http4s-circe"        % "0.18.0",
   "org.http4s" %% "http4s-dsl"          % "0.18.0"   
)

Server

Service: Get

Middleware

Matching url & params

/demo/employee/6

/demo/employee/filter/2015-01-01/2018-02-01?name=Pepe&minimum-age=25&offset=0

Service: Post

curl -v -X POST -H "Content-type: application/json" -d '{"name":"Juan","salary":12000}' 'http://localhost:9290/demo/company/hire/9'

HttpClient: Get

HttpClient: Post

 

  • Integración con circe

  • Middleware

  • Liviano

  • Streaming

  • Cookies

  • Urls incorrectas

Pros & Cons

Bigger example: Client + DB

Resources

Muchas gracias!

Made with Slides.com