Translate

lunes, 24 de febrero de 2020

ZIO

ZIO es una biblioteca Scala de dependencia cero para programación asincrónica y concurrente. Y tiene un logo muuuuyyyy copado...

Su filosofía esta basada en fibras (que son como hilos de ejecución) altamente escalables y sin bloqueo que nunca desperdician ni pierden recursos, ZIO permite crear aplicaciones escalables, resistentes y reactivas que satisfagan las necesidades de su negocio. Entre las características podemos nombrar:
  • Alto rendimiento. 
  • Tipe-safe. 
  • Concurrente. 
  • Asincrónico. 
  • Seguridad en los recursos. 
  • Probable 
  • Elástico. 
  • Funcional. 
Antes de empezar debemos incluir a ZIO en el proyecto agregando la siguiente entrade en el build.sbt:

libraryDependencies += "dev.zio" %% "zio" % "1.0.0-RC17"

Si deseamos utilizar streams ZIO, también debe incluir la siguiente dependencia:

libraryDependencies += "dev.zio" %% "zio-streams" % "1.0.0-RC17"

Ahora veamos un pequeño ejemplo: 

import zio.App
import zio.console._

object MyApp extends App {

  def run(args: List[String]) =
    myAppLogic.fold(_ => 1, _ => 0)

  val myAppLogic =
    for {
      _    <- putStrLn("Hello! What is your name?")
      name <- getStrLn
      _    <- putStrLn(s"Hello, ${name}, welcome to ZIO!")
    } yield ()
}

run debería devolver un valor ZIO que tenga todos sus errores manejados,

Como se puede ver myAppLogic, se plegó de tal forma que produce un valor si falla, habrá un 1; pero si tiene éxito, habrá un 0.

Si está integrando ZIO en una aplicación existente, utilizando inyección de dependencia, o no controla su función principal main, se puede crear un sistema de tiempo de ejecución para ejecutar sus programas ZIO:

import zio._
import zio.console._

object IntegrationExample {
  val runtime = new DefaultRuntime {}

  runtime.unsafeRun(putStrLn("Hello World!"))
}

ZIO proporciona un módulo para interactuar con la consola. Puede importar las funciones en este módulo con el siguiente fragmento de código:

import zio.console._

Si necesita imprimir texto en la consola, puede usar putStr y putStrLn:

// Print without trailing line break
putStr("Hello World")
// res8: ZIO[Console, Nothing, Unit] = zio.ZIO$Read@2ba3e0d1

// Print string and include trailing line break
putStrLn("Hello World")
// res9: ZIO[Console, Nothing, Unit] = zio.ZIO$Read@75e3acfe

Si necesita leer la entrada desde la consola, puede usar getStrLn:

val echo = getStrLn flatMap putStrLn
// echo: ZIO[Console, java.io.IOException, Unit] = zio.ZIO$FlatMap@72bc78be

Es importante utilizar la consola de zio porque cada fibra tiene sus propios recursos, y la consola de Zio soluciona la interacción con la consola. 

Dejo link : https://zio.dev/