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."
-
Funciones
casipuras-
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
- Code Demo: https://github.com/despegar/stack-web-functional
- Paper Why Functional Programming Matters?
- Book to start with Functional Programming: Functional Programming in Scala
- Book of Doobie: http://tpolecat.github.io/doobie/book.html
- Talk - Programs as Values: JDBC Programming with Doobie, by Rob Norris: https://www.youtube.com/watch?v=M5MF6M7FHPo
- Http4s Doc: http://http4s.org/v0.18/
- Circe: https://circe.github.io/circe/
- Cats Effect: https://github.com/typelevel/cats-effect
- Repos as examples:
Muchas gracias!
Stack Funcional
By María Alejandra Holman
Stack Funcional
- 556