SlideShare a Scribd company logo
IZUMI 1.0
YOUR NEXT SCALA STACK
INTRO
WHO WE ARE
▸ Pavel and Kai
▸ Septimal Mind, an Irish consultancy
▸ Engineer’s productivity is our primary concern
▸ Love Scala and pure FP
▸ Scala contributors
INTRO
WHAT WE DO
▸ We identify productivity issues in SDLC pipeline
▸ We build tools to address these issues
INTRO
WHAT WE USE
‣ We've been using Scala for many years
‣ Bifuctors are beneficial, we've been using Scalactic
‣ We've adopted ZIO since first public alpha
‣ It closed the everlasting question of error encoding
INTRO
OPEN QUESTION
How do we design
complex but extensible
FP applications?
(Hundreds/thousands of components)
INTRO
THE ANSWER
Modularity and modules
INTRO
HOW TO GET THERE?
‣ Dependency Injection
‣ Tagless Final
IZUMI
WE MADE OUR OWN "NANOFRAMEWORK", IZUMI
‣ DIStage: Advanced Dependency Injection
‣ BIO: Tagless Final for Bifunctors and Trifunctors
Also:
‣ LogStage: Zero-Effort Structural logging
‣ etc
BIO
WHAT IS BIO?
‣ A set of typeclasses for Bifunctors and Trifunctors
‣ Like Cats but for F[+_, +_] and F[-_, +_, +_]
‣ Should be incorporated into ZIO Prelude in foreseeable
future
DISTAGE
WHAT IS DISTAGE?
‣ Your regular Dependency Injection library
‣ Supports F[_]
‣ Unique feature: configurable applications
‣ Since 1.0: State-of-the-art compile-time verification
‣ Many features: resources/lifecycles, integration checks, etc
‣ The most advanced DI/Module system available
IZUMI 1.0: DISTAGE
WHAT IS A CONFIGURABLE APP?
‣ An application may run in several "modes"
‣ E.g. Purpose={Test|Prod}, Database={Dummy|Postgres}
‣ Modes can be chosen at application startup
‣ Modes may be combined
‣ The app should choose right component implementations
‣ And block incorrect combinations
IZUMI 1.0: DISTAGE
WHAT IS A CONFIGURABLE APP?
‣ Purpose = Production | Test
‣ Database = Postgres | Oracle | Dummy
‣ We may want to run tests with Postgres database (but never with Oracle)
‣ We want to never run tests with production payment service
‣ We may want to define defaults
‣ Database is not set for Prod run => use Postgres
IZUMI 1.0: DISTAGE
CONFIGURABLE APP: HOW?
There was no good way to write configurable apps
IZUMI 1.0: DISTAGE
CONFIGURABLE APP: HOW?
...hard to code, hard to maintain...
...exponential amount of code paths...
...edgecases...
IZUMI 1.0: DISTAGE
CONFIGURABLE APP: HOW?
‣ It's hard to do it
‣ ... even if you don't have transitive dependencies
‣ ... even if you don't have dependent constraints
‣ It's even harder to provide compile-time guarantees
IZUMI 1.0: DISTAGE
CONFIGURABLE APP: HOW?
def makeUserRepo(config: Config): IUserRepo[F] = {
config.database match {
case OracleDb =>
if (!config.isProd) {
throw new RuntimeException("Oracle unsupported in test mode!")
} else {
new ProdOracleUserRepo[F]( /*...*/ )
}
case PgDb =>
new ProdPGUserRepo[F]( /*...*/ )
case Unset =>
if (config.isProd) {
throw new RuntimeException("Database is not set for prod mode!")
} else {
new DummyUserRepo[F]()
}
}
}
IZUMI 1.0: DISTAGE
CONFIGURABLE APP: HOW?
DIStage made it possible
Though it was doing things in runtime...
We thought compile-time solution is impossible...
IZUMI 1.0: DISTAGE
CONFIGURABLE APP: HOW?
DIStage since Izumi 1.0:
strong compile-time guarantees
for
configurable apps
IZUMI 1.0: DISTAGE
CONFIGURABLE APP WITH DISTAGE
class MyAppDefinition[F[+_, +_]: TagKK] extends PluginDef {
make[EnterpriseApp[F]]
make[AccountsService[F]]
make[UsersService[F]]
make[IUserRepo[F]].from[DummyUserRepo[F]].tagged(Mode.Test)
make[IUserRepo[F]].from[ProdPGUserRepo[F]].tagged(Db.Pg)
make[IUserRepo[F]].from[ProdOracleUserRepo[F]].tagged(Mode.Prod, Db.Oracle)
make[IAccountsRepo[F]].from[DummyAccRepo[F]].tagged(Mode.Test)
make[IAccountsRepo[F]].from[ProdPGAccRepo[F]].tagged(Db.Pg)
make[IAccountsRepo[F]].from[ProdOracleAccRepo[F]].tagged(Mode.Prod, Db.Oracle)
make[IPaymentsGateway[F]].from[DummyPayments[F]].tagged(Mode.Test)
make[IPaymentsGateway[F]].from[StripePayments[F]].tagged(Mode.Prod)
}
IZUMI 1.0: DISTAGE
COMPILE-TIME SAFETY
// your main method
object EnterpriseMain extends RoleAppMain.LauncherBIO[zio.IO] { ... }
// in test scope
object WiringTest extends PlanCheck.Main(EnterpriseMain)
IZUMI 1.0: DISTAGE
COMPILE-TIME SAFETY
// your main method
object EnterpriseMain extends RoleAppMain.LauncherBIO[zio.IO] { ... }
// in test scope
object WiringTest extends PlanCheck.Main(EnterpriseMain)
HOW DOES IT WORK?
IZUMI 1.0: DISTAGE
COMPILE-TIME SAFETY
// your main method
object EnterpriseMain extends RoleAppMain.LauncherBIO[zio.IO] { ... }
// in test scope
object WiringTest extends PlanCheck.Main(EnterpriseMain)
HOW DOES IT WORK?
abstract class PluginDef[T](implicit recompilationToken: RecompilationToken[T])
IZUMI 1.0: BIO
BIO TYPECLASSES
IZUMI 1.0: BIO
BIO SUMMONER
import izumi.functional.bio.F
class DummyUserRepo[F[+_, +_]: Monad2]
F.pure(...)

F.fail(...)

F.fromEither(...)
Error2[F].fail(...)
See also: https://www.youtube.com/watch?v=ZdGK1uedAE0&t=580s
IZUMI 1.0: BIO
BIO SYNTAX
import izumi.functional.bio.{F, Error2}
// IDE auto imports
def launchMissiles[F[+_, +_]: Error2](target: Target) =
for {
_ <- F.unless(storage.hasMissiles)(F.fail(AmmoDepleted))
_ <- loadMissile(launcher, storage)
_ <- fireMissile(launcher)
.catchAll(_ => emergencyStop)
_ <- F.unless(target.isAnnihilated)(launchMissiles(target))
} yield res
import cats.syntax.all._
import cats.effect.syntax.all._
import monix.catnap.syntax._
IZUMI 1.0: BIO
COMPATIBILITY
import izumi.functional.bio.catz._
def http4sServer[F[+_, +_]: Async2: Fork2: UnsafeRun2] = {
BlazeServerBuilder[F[Throwable, ?]](ec)
.bindHttp(8080)
.withSslContext(sslContext)
.resource
}
ConcurrentEffect[F[Throwable, ?]]
MonadError[F[Throwable, ?], Throwable]
IZUMI 1.0: SUMMARY
CONCLUSION
‣ BIO provides a great set of TF abstractions
‣ DIStage is great for global/static contexts
‣ and ZIO's reader is perfect for local/dynamic contexts
‣ Izumi 1.0+ZIO is the most productive Scala stack
‣ And battle-tested
‣ There is no excuse not to use DIStage anymore
‣ Consider it for your next Scala project
Thank you!
https://github.com/7mind/izumi
https://github.com/7mind/distage-example
https://twitter.com/shirshovp
https://twitter.com/kai_nyasha

More Related Content

What's hot

Contravariant functors in scala
Contravariant functors in scalaContravariant functors in scala
Contravariant functors in scala
Piotr Paradziński
 
Refactoring Functional Type Classes
Refactoring Functional Type ClassesRefactoring Functional Type Classes
Refactoring Functional Type Classes
John De Goes
 
Exploring ZIO Prelude: The game changer for typeclasses in Scala
Exploring ZIO Prelude: The game changer for typeclasses in ScalaExploring ZIO Prelude: The game changer for typeclasses in Scala
Exploring ZIO Prelude: The game changer for typeclasses in Scala
Jorge Vásquez
 
Implicit parameters, when to use them (or not)!
Implicit parameters, when to use them (or not)!Implicit parameters, when to use them (or not)!
Implicit parameters, when to use them (or not)!
Julien Truffaut
 
Programación Funcional 101 con Scala y ZIO 2.0
Programación Funcional 101 con Scala y ZIO 2.0Programación Funcional 101 con Scala y ZIO 2.0
Programación Funcional 101 con Scala y ZIO 2.0
Jorge Vásquez
 
Coroutines in Kotlin
Coroutines in KotlinCoroutines in Kotlin
Coroutines in Kotlin
Alexey Soshin
 
Applicative style programming
Applicative style programmingApplicative style programming
Applicative style programming
José Luis García Hernández
 
Caliban: Functional GraphQL Library for Scala
Caliban: Functional GraphQL Library for ScalaCaliban: Functional GraphQL Library for Scala
Caliban: Functional GraphQL Library for Scala
Pierre Ricadat
 
Why functional programming and category theory strongly matters
Why functional programming and category theory strongly mattersWhy functional programming and category theory strongly matters
Why functional programming and category theory strongly matters
Piotr Paradziński
 
Nosql databases
Nosql databasesNosql databases
Nosql databases
ateeq ateeq
 
Java GC
Java GCJava GC
Java GC
Ray Cheng
 
Kotlin
KotlinKotlin
Kotlin
Rory Preddy
 
Monoids - Part 1 - with examples using Scalaz and Cats
Monoids - Part 1 - with examples using Scalaz and CatsMonoids - Part 1 - with examples using Scalaz and Cats
Monoids - Part 1 - with examples using Scalaz and Cats
Philip Schwarz
 
Preparing for Scala 3
Preparing for Scala 3Preparing for Scala 3
Preparing for Scala 3
Martin Odersky
 
Triggers in plsql
Triggers in plsqlTriggers in plsql
Triggers in plsql
Arun Sial
 
Functional Programming 101 with Scala and ZIO @FunctionalWorld
Functional Programming 101 with Scala and ZIO @FunctionalWorldFunctional Programming 101 with Scala and ZIO @FunctionalWorld
Functional Programming 101 with Scala and ZIO @FunctionalWorld
Jorge Vásquez
 
Kotlin as a Better Java
Kotlin as a Better JavaKotlin as a Better Java
Kotlin as a Better Java
Garth Gilmour
 
Kotlin InDepth Tutorial for beginners 2022
Kotlin InDepth Tutorial for beginners 2022Kotlin InDepth Tutorial for beginners 2022
Kotlin InDepth Tutorial for beginners 2022
Simplilearn
 
Functor, Apply, Applicative And Monad
Functor, Apply, Applicative And MonadFunctor, Apply, Applicative And Monad
Functor, Apply, Applicative And Monad
Oliver Daff
 
Zio in real world
Zio in real worldZio in real world
Zio in real world
Wiem Zine Elabidine
 

What's hot (20)

Contravariant functors in scala
Contravariant functors in scalaContravariant functors in scala
Contravariant functors in scala
 
Refactoring Functional Type Classes
Refactoring Functional Type ClassesRefactoring Functional Type Classes
Refactoring Functional Type Classes
 
Exploring ZIO Prelude: The game changer for typeclasses in Scala
Exploring ZIO Prelude: The game changer for typeclasses in ScalaExploring ZIO Prelude: The game changer for typeclasses in Scala
Exploring ZIO Prelude: The game changer for typeclasses in Scala
 
Implicit parameters, when to use them (or not)!
Implicit parameters, when to use them (or not)!Implicit parameters, when to use them (or not)!
Implicit parameters, when to use them (or not)!
 
Programación Funcional 101 con Scala y ZIO 2.0
Programación Funcional 101 con Scala y ZIO 2.0Programación Funcional 101 con Scala y ZIO 2.0
Programación Funcional 101 con Scala y ZIO 2.0
 
Coroutines in Kotlin
Coroutines in KotlinCoroutines in Kotlin
Coroutines in Kotlin
 
Applicative style programming
Applicative style programmingApplicative style programming
Applicative style programming
 
Caliban: Functional GraphQL Library for Scala
Caliban: Functional GraphQL Library for ScalaCaliban: Functional GraphQL Library for Scala
Caliban: Functional GraphQL Library for Scala
 
Why functional programming and category theory strongly matters
Why functional programming and category theory strongly mattersWhy functional programming and category theory strongly matters
Why functional programming and category theory strongly matters
 
Nosql databases
Nosql databasesNosql databases
Nosql databases
 
Java GC
Java GCJava GC
Java GC
 
Kotlin
KotlinKotlin
Kotlin
 
Monoids - Part 1 - with examples using Scalaz and Cats
Monoids - Part 1 - with examples using Scalaz and CatsMonoids - Part 1 - with examples using Scalaz and Cats
Monoids - Part 1 - with examples using Scalaz and Cats
 
Preparing for Scala 3
Preparing for Scala 3Preparing for Scala 3
Preparing for Scala 3
 
Triggers in plsql
Triggers in plsqlTriggers in plsql
Triggers in plsql
 
Functional Programming 101 with Scala and ZIO @FunctionalWorld
Functional Programming 101 with Scala and ZIO @FunctionalWorldFunctional Programming 101 with Scala and ZIO @FunctionalWorld
Functional Programming 101 with Scala and ZIO @FunctionalWorld
 
Kotlin as a Better Java
Kotlin as a Better JavaKotlin as a Better Java
Kotlin as a Better Java
 
Kotlin InDepth Tutorial for beginners 2022
Kotlin InDepth Tutorial for beginners 2022Kotlin InDepth Tutorial for beginners 2022
Kotlin InDepth Tutorial for beginners 2022
 
Functor, Apply, Applicative And Monad
Functor, Apply, Applicative And MonadFunctor, Apply, Applicative And Monad
Functor, Apply, Applicative And Monad
 
Zio in real world
Zio in real worldZio in real world
Zio in real world
 

Similar to Izumi 1.0: Your Next Scala Stack

Scala, Functional Programming and Team Productivity
Scala, Functional Programming and Team ProductivityScala, Functional Programming and Team Productivity
Scala, Functional Programming and Team Productivity
7mind
 
Bci for Beginners
Bci for BeginnersBci for Beginners
Bci for Beginners
IainLewis
 
How to Architect and Develop Cloud Native Applications
How to Architect and Develop Cloud Native ApplicationsHow to Architect and Develop Cloud Native Applications
How to Architect and Develop Cloud Native Applications
Sufyaan Kazi
 
Codename one
Codename oneCodename one
Extending uBuild and uDeploy with Plugins
Extending uBuild and uDeploy with PluginsExtending uBuild and uDeploy with Plugins
Extending uBuild and uDeploy with Plugins
IBM UrbanCode Products
 
SOA Knowledge Kit, Developer Productivity and Performance Comparison Analysis
SOA Knowledge Kit, Developer Productivity  and Performance Comparison AnalysisSOA Knowledge Kit, Developer Productivity  and Performance Comparison Analysis
SOA Knowledge Kit, Developer Productivity and Performance Comparison Analysis
Clever Moe
 
Maximize the power of OSGi in AEM
Maximize the power of OSGi in AEM Maximize the power of OSGi in AEM
Maximize the power of OSGi in AEM
ICF CIRCUIT
 
What's new in p2 (2009)?
What's new in p2 (2009)?What's new in p2 (2009)?
What's new in p2 (2009)?
Pascal Rapicault
 
Mobile UI Testing using Appium and Docker
Mobile UI Testing using Appium and DockerMobile UI Testing using Appium and Docker
Mobile UI Testing using Appium and Docker
Moataz Nabil
 
Automating load testing with CI integration slideshare
Automating load testing with CI integration slideshareAutomating load testing with CI integration slideshare
Automating load testing with CI integration slideshare
John Emmitt
 
Homestead demo
Homestead demoHomestead demo
Homestead demo
Saranga Tripathy
 
Fujitsu Services _Large Scale EBS 12.2 Upgrade Licking the Wounds_Mike_Salt.pdf
Fujitsu Services _Large Scale EBS 12.2 Upgrade Licking the Wounds_Mike_Salt.pdfFujitsu Services _Large Scale EBS 12.2 Upgrade Licking the Wounds_Mike_Salt.pdf
Fujitsu Services _Large Scale EBS 12.2 Upgrade Licking the Wounds_Mike_Salt.pdf
Kommaneni Sreenivasulu
 
Mike_Salt.pdf
Mike_Salt.pdfMike_Salt.pdf
Mike_Salt.pdf
SayedMahfouz3
 
Pwning mobile apps without root or jailbreak
Pwning mobile apps without root or jailbreakPwning mobile apps without root or jailbreak
Pwning mobile apps without root or jailbreak
Abraham Aranguren
 
How to kill test flake in appium
How to kill test flake in appiumHow to kill test flake in appium
How to kill test flake in appium
Gaurav Singh
 
How to generate code coverage reports in xcode with slather
How to generate code coverage reports in xcode with slatherHow to generate code coverage reports in xcode with slather
How to generate code coverage reports in xcode with slather
allanh0526
 
The Basic Concept Of IOC
The Basic Concept Of IOCThe Basic Concept Of IOC
The Basic Concept Of IOC
Carl Lu
 
Getting started with appium
Getting started with appiumGetting started with appium
Getting started with appium
Pratik Patel
 
Java EE Microservices
Java EE MicroservicesJava EE Microservices
Java EE Microservices
jclingan
 
DS, BP, EJB, CDI, WTF!? - Graham Charters
DS, BP, EJB, CDI, WTF!? - Graham ChartersDS, BP, EJB, CDI, WTF!? - Graham Charters
DS, BP, EJB, CDI, WTF!? - Graham Charters
mfrancis
 

Similar to Izumi 1.0: Your Next Scala Stack (20)

Scala, Functional Programming and Team Productivity
Scala, Functional Programming and Team ProductivityScala, Functional Programming and Team Productivity
Scala, Functional Programming and Team Productivity
 
Bci for Beginners
Bci for BeginnersBci for Beginners
Bci for Beginners
 
How to Architect and Develop Cloud Native Applications
How to Architect and Develop Cloud Native ApplicationsHow to Architect and Develop Cloud Native Applications
How to Architect and Develop Cloud Native Applications
 
Codename one
Codename oneCodename one
Codename one
 
Extending uBuild and uDeploy with Plugins
Extending uBuild and uDeploy with PluginsExtending uBuild and uDeploy with Plugins
Extending uBuild and uDeploy with Plugins
 
SOA Knowledge Kit, Developer Productivity and Performance Comparison Analysis
SOA Knowledge Kit, Developer Productivity  and Performance Comparison AnalysisSOA Knowledge Kit, Developer Productivity  and Performance Comparison Analysis
SOA Knowledge Kit, Developer Productivity and Performance Comparison Analysis
 
Maximize the power of OSGi in AEM
Maximize the power of OSGi in AEM Maximize the power of OSGi in AEM
Maximize the power of OSGi in AEM
 
What's new in p2 (2009)?
What's new in p2 (2009)?What's new in p2 (2009)?
What's new in p2 (2009)?
 
Mobile UI Testing using Appium and Docker
Mobile UI Testing using Appium and DockerMobile UI Testing using Appium and Docker
Mobile UI Testing using Appium and Docker
 
Automating load testing with CI integration slideshare
Automating load testing with CI integration slideshareAutomating load testing with CI integration slideshare
Automating load testing with CI integration slideshare
 
Homestead demo
Homestead demoHomestead demo
Homestead demo
 
Fujitsu Services _Large Scale EBS 12.2 Upgrade Licking the Wounds_Mike_Salt.pdf
Fujitsu Services _Large Scale EBS 12.2 Upgrade Licking the Wounds_Mike_Salt.pdfFujitsu Services _Large Scale EBS 12.2 Upgrade Licking the Wounds_Mike_Salt.pdf
Fujitsu Services _Large Scale EBS 12.2 Upgrade Licking the Wounds_Mike_Salt.pdf
 
Mike_Salt.pdf
Mike_Salt.pdfMike_Salt.pdf
Mike_Salt.pdf
 
Pwning mobile apps without root or jailbreak
Pwning mobile apps without root or jailbreakPwning mobile apps without root or jailbreak
Pwning mobile apps without root or jailbreak
 
How to kill test flake in appium
How to kill test flake in appiumHow to kill test flake in appium
How to kill test flake in appium
 
How to generate code coverage reports in xcode with slather
How to generate code coverage reports in xcode with slatherHow to generate code coverage reports in xcode with slather
How to generate code coverage reports in xcode with slather
 
The Basic Concept Of IOC
The Basic Concept Of IOCThe Basic Concept Of IOC
The Basic Concept Of IOC
 
Getting started with appium
Getting started with appiumGetting started with appium
Getting started with appium
 
Java EE Microservices
Java EE MicroservicesJava EE Microservices
Java EE Microservices
 
DS, BP, EJB, CDI, WTF!? - Graham Charters
DS, BP, EJB, CDI, WTF!? - Graham ChartersDS, BP, EJB, CDI, WTF!? - Graham Charters
DS, BP, EJB, CDI, WTF!? - Graham Charters
 

Recently uploaded

Top 9 Trends in Cybersecurity for 2024.pptx
Top 9 Trends in Cybersecurity for 2024.pptxTop 9 Trends in Cybersecurity for 2024.pptx
Top 9 Trends in Cybersecurity for 2024.pptx
devvsandy
 
UI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
UI5con 2024 - Boost Your Development Experience with UI5 Tooling ExtensionsUI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
UI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
Peter Muessig
 
Everything You Need to Know About X-Sign: The eSign Functionality of XfilesPr...
Everything You Need to Know About X-Sign: The eSign Functionality of XfilesPr...Everything You Need to Know About X-Sign: The eSign Functionality of XfilesPr...
Everything You Need to Know About X-Sign: The eSign Functionality of XfilesPr...
XfilesPro
 
E-commerce Development Services- Hornet Dynamics
E-commerce Development Services- Hornet DynamicsE-commerce Development Services- Hornet Dynamics
E-commerce Development Services- Hornet Dynamics
Hornet Dynamics
 
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Łukasz Chruściel
 
Mobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona InfotechMobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona Infotech
Drona Infotech
 
Modelling Up - DDDEurope 2024 - Amsterdam
Modelling Up - DDDEurope 2024 - AmsterdamModelling Up - DDDEurope 2024 - Amsterdam
Modelling Up - DDDEurope 2024 - Amsterdam
Alberto Brandolini
 
UI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
UI5con 2024 - Keynote: Latest News about UI5 and it’s EcosystemUI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
UI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
Peter Muessig
 
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
mz5nrf0n
 
How Can Hiring A Mobile App Development Company Help Your Business Grow?
How Can Hiring A Mobile App Development Company Help Your Business Grow?How Can Hiring A Mobile App Development Company Help Your Business Grow?
How Can Hiring A Mobile App Development Company Help Your Business Grow?
ToXSL Technologies
 
Transform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR SolutionsTransform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR Solutions
TheSMSPoint
 
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian CompaniesE-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
Quickdice ERP
 
Artificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension FunctionsArtificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension Functions
Octavian Nadolu
 
Unveiling the Advantages of Agile Software Development.pdf
Unveiling the Advantages of Agile Software Development.pdfUnveiling the Advantages of Agile Software Development.pdf
Unveiling the Advantages of Agile Software Development.pdf
brainerhub1
 
Malibou Pitch Deck For Its €3M Seed Round
Malibou Pitch Deck For Its €3M Seed RoundMalibou Pitch Deck For Its €3M Seed Round
Malibou Pitch Deck For Its €3M Seed Round
sjcobrien
 
WWDC 2024 Keynote Review: For CocoaCoders Austin
WWDC 2024 Keynote Review: For CocoaCoders AustinWWDC 2024 Keynote Review: For CocoaCoders Austin
WWDC 2024 Keynote Review: For CocoaCoders Austin
Patrick Weigel
 
SQL Accounting Software Brochure Malaysia
SQL Accounting Software Brochure MalaysiaSQL Accounting Software Brochure Malaysia
SQL Accounting Software Brochure Malaysia
GohKiangHock
 
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
Bert Jan Schrijver
 
Using Query Store in Azure PostgreSQL to Understand Query Performance
Using Query Store in Azure PostgreSQL to Understand Query PerformanceUsing Query Store in Azure PostgreSQL to Understand Query Performance
Using Query Store in Azure PostgreSQL to Understand Query Performance
Grant Fritchey
 
zOS Mainframe JES2-JES3 JCL-JECL Differences
zOS Mainframe JES2-JES3 JCL-JECL DifferenceszOS Mainframe JES2-JES3 JCL-JECL Differences
zOS Mainframe JES2-JES3 JCL-JECL Differences
YousufSait3
 

Recently uploaded (20)

Top 9 Trends in Cybersecurity for 2024.pptx
Top 9 Trends in Cybersecurity for 2024.pptxTop 9 Trends in Cybersecurity for 2024.pptx
Top 9 Trends in Cybersecurity for 2024.pptx
 
UI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
UI5con 2024 - Boost Your Development Experience with UI5 Tooling ExtensionsUI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
UI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
 
Everything You Need to Know About X-Sign: The eSign Functionality of XfilesPr...
Everything You Need to Know About X-Sign: The eSign Functionality of XfilesPr...Everything You Need to Know About X-Sign: The eSign Functionality of XfilesPr...
Everything You Need to Know About X-Sign: The eSign Functionality of XfilesPr...
 
E-commerce Development Services- Hornet Dynamics
E-commerce Development Services- Hornet DynamicsE-commerce Development Services- Hornet Dynamics
E-commerce Development Services- Hornet Dynamics
 
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
 
Mobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona InfotechMobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona Infotech
 
Modelling Up - DDDEurope 2024 - Amsterdam
Modelling Up - DDDEurope 2024 - AmsterdamModelling Up - DDDEurope 2024 - Amsterdam
Modelling Up - DDDEurope 2024 - Amsterdam
 
UI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
UI5con 2024 - Keynote: Latest News about UI5 and it’s EcosystemUI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
UI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
 
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
 
How Can Hiring A Mobile App Development Company Help Your Business Grow?
How Can Hiring A Mobile App Development Company Help Your Business Grow?How Can Hiring A Mobile App Development Company Help Your Business Grow?
How Can Hiring A Mobile App Development Company Help Your Business Grow?
 
Transform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR SolutionsTransform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR Solutions
 
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian CompaniesE-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
 
Artificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension FunctionsArtificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension Functions
 
Unveiling the Advantages of Agile Software Development.pdf
Unveiling the Advantages of Agile Software Development.pdfUnveiling the Advantages of Agile Software Development.pdf
Unveiling the Advantages of Agile Software Development.pdf
 
Malibou Pitch Deck For Its €3M Seed Round
Malibou Pitch Deck For Its €3M Seed RoundMalibou Pitch Deck For Its €3M Seed Round
Malibou Pitch Deck For Its €3M Seed Round
 
WWDC 2024 Keynote Review: For CocoaCoders Austin
WWDC 2024 Keynote Review: For CocoaCoders AustinWWDC 2024 Keynote Review: For CocoaCoders Austin
WWDC 2024 Keynote Review: For CocoaCoders Austin
 
SQL Accounting Software Brochure Malaysia
SQL Accounting Software Brochure MalaysiaSQL Accounting Software Brochure Malaysia
SQL Accounting Software Brochure Malaysia
 
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
 
Using Query Store in Azure PostgreSQL to Understand Query Performance
Using Query Store in Azure PostgreSQL to Understand Query PerformanceUsing Query Store in Azure PostgreSQL to Understand Query Performance
Using Query Store in Azure PostgreSQL to Understand Query Performance
 
zOS Mainframe JES2-JES3 JCL-JECL Differences
zOS Mainframe JES2-JES3 JCL-JECL DifferenceszOS Mainframe JES2-JES3 JCL-JECL Differences
zOS Mainframe JES2-JES3 JCL-JECL Differences
 

Izumi 1.0: Your Next Scala Stack

  • 1. IZUMI 1.0 YOUR NEXT SCALA STACK
  • 2. INTRO WHO WE ARE ▸ Pavel and Kai ▸ Septimal Mind, an Irish consultancy ▸ Engineer’s productivity is our primary concern ▸ Love Scala and pure FP ▸ Scala contributors
  • 3. INTRO WHAT WE DO ▸ We identify productivity issues in SDLC pipeline ▸ We build tools to address these issues
  • 4. INTRO WHAT WE USE ‣ We've been using Scala for many years ‣ Bifuctors are beneficial, we've been using Scalactic ‣ We've adopted ZIO since first public alpha ‣ It closed the everlasting question of error encoding
  • 5. INTRO OPEN QUESTION How do we design complex but extensible FP applications? (Hundreds/thousands of components)
  • 7. INTRO HOW TO GET THERE? ‣ Dependency Injection ‣ Tagless Final
  • 8. IZUMI WE MADE OUR OWN "NANOFRAMEWORK", IZUMI ‣ DIStage: Advanced Dependency Injection ‣ BIO: Tagless Final for Bifunctors and Trifunctors Also: ‣ LogStage: Zero-Effort Structural logging ‣ etc
  • 9. BIO WHAT IS BIO? ‣ A set of typeclasses for Bifunctors and Trifunctors ‣ Like Cats but for F[+_, +_] and F[-_, +_, +_] ‣ Should be incorporated into ZIO Prelude in foreseeable future
  • 10. DISTAGE WHAT IS DISTAGE? ‣ Your regular Dependency Injection library ‣ Supports F[_] ‣ Unique feature: configurable applications ‣ Since 1.0: State-of-the-art compile-time verification ‣ Many features: resources/lifecycles, integration checks, etc ‣ The most advanced DI/Module system available
  • 11. IZUMI 1.0: DISTAGE WHAT IS A CONFIGURABLE APP? ‣ An application may run in several "modes" ‣ E.g. Purpose={Test|Prod}, Database={Dummy|Postgres} ‣ Modes can be chosen at application startup ‣ Modes may be combined ‣ The app should choose right component implementations ‣ And block incorrect combinations
  • 12. IZUMI 1.0: DISTAGE WHAT IS A CONFIGURABLE APP? ‣ Purpose = Production | Test ‣ Database = Postgres | Oracle | Dummy ‣ We may want to run tests with Postgres database (but never with Oracle) ‣ We want to never run tests with production payment service ‣ We may want to define defaults ‣ Database is not set for Prod run => use Postgres
  • 13. IZUMI 1.0: DISTAGE CONFIGURABLE APP: HOW? There was no good way to write configurable apps
  • 14. IZUMI 1.0: DISTAGE CONFIGURABLE APP: HOW? ...hard to code, hard to maintain... ...exponential amount of code paths... ...edgecases...
  • 15. IZUMI 1.0: DISTAGE CONFIGURABLE APP: HOW? ‣ It's hard to do it ‣ ... even if you don't have transitive dependencies ‣ ... even if you don't have dependent constraints ‣ It's even harder to provide compile-time guarantees
  • 16. IZUMI 1.0: DISTAGE CONFIGURABLE APP: HOW? def makeUserRepo(config: Config): IUserRepo[F] = { config.database match { case OracleDb => if (!config.isProd) { throw new RuntimeException("Oracle unsupported in test mode!") } else { new ProdOracleUserRepo[F]( /*...*/ ) } case PgDb => new ProdPGUserRepo[F]( /*...*/ ) case Unset => if (config.isProd) { throw new RuntimeException("Database is not set for prod mode!") } else { new DummyUserRepo[F]() } } }
  • 17. IZUMI 1.0: DISTAGE CONFIGURABLE APP: HOW? DIStage made it possible Though it was doing things in runtime... We thought compile-time solution is impossible...
  • 18. IZUMI 1.0: DISTAGE CONFIGURABLE APP: HOW? DIStage since Izumi 1.0: strong compile-time guarantees for configurable apps
  • 19. IZUMI 1.0: DISTAGE CONFIGURABLE APP WITH DISTAGE class MyAppDefinition[F[+_, +_]: TagKK] extends PluginDef { make[EnterpriseApp[F]] make[AccountsService[F]] make[UsersService[F]] make[IUserRepo[F]].from[DummyUserRepo[F]].tagged(Mode.Test) make[IUserRepo[F]].from[ProdPGUserRepo[F]].tagged(Db.Pg) make[IUserRepo[F]].from[ProdOracleUserRepo[F]].tagged(Mode.Prod, Db.Oracle) make[IAccountsRepo[F]].from[DummyAccRepo[F]].tagged(Mode.Test) make[IAccountsRepo[F]].from[ProdPGAccRepo[F]].tagged(Db.Pg) make[IAccountsRepo[F]].from[ProdOracleAccRepo[F]].tagged(Mode.Prod, Db.Oracle) make[IPaymentsGateway[F]].from[DummyPayments[F]].tagged(Mode.Test) make[IPaymentsGateway[F]].from[StripePayments[F]].tagged(Mode.Prod) }
  • 20. IZUMI 1.0: DISTAGE COMPILE-TIME SAFETY // your main method object EnterpriseMain extends RoleAppMain.LauncherBIO[zio.IO] { ... } // in test scope object WiringTest extends PlanCheck.Main(EnterpriseMain)
  • 21. IZUMI 1.0: DISTAGE COMPILE-TIME SAFETY // your main method object EnterpriseMain extends RoleAppMain.LauncherBIO[zio.IO] { ... } // in test scope object WiringTest extends PlanCheck.Main(EnterpriseMain) HOW DOES IT WORK?
  • 22. IZUMI 1.0: DISTAGE COMPILE-TIME SAFETY // your main method object EnterpriseMain extends RoleAppMain.LauncherBIO[zio.IO] { ... } // in test scope object WiringTest extends PlanCheck.Main(EnterpriseMain) HOW DOES IT WORK? abstract class PluginDef[T](implicit recompilationToken: RecompilationToken[T])
  • 23. IZUMI 1.0: BIO BIO TYPECLASSES
  • 24. IZUMI 1.0: BIO BIO SUMMONER import izumi.functional.bio.F class DummyUserRepo[F[+_, +_]: Monad2] F.pure(...)
 F.fail(...)
 F.fromEither(...) Error2[F].fail(...) See also: https://www.youtube.com/watch?v=ZdGK1uedAE0&t=580s
  • 25. IZUMI 1.0: BIO BIO SYNTAX import izumi.functional.bio.{F, Error2} // IDE auto imports def launchMissiles[F[+_, +_]: Error2](target: Target) = for { _ <- F.unless(storage.hasMissiles)(F.fail(AmmoDepleted)) _ <- loadMissile(launcher, storage) _ <- fireMissile(launcher) .catchAll(_ => emergencyStop) _ <- F.unless(target.isAnnihilated)(launchMissiles(target)) } yield res import cats.syntax.all._ import cats.effect.syntax.all._ import monix.catnap.syntax._
  • 26. IZUMI 1.0: BIO COMPATIBILITY import izumi.functional.bio.catz._ def http4sServer[F[+_, +_]: Async2: Fork2: UnsafeRun2] = { BlazeServerBuilder[F[Throwable, ?]](ec) .bindHttp(8080) .withSslContext(sslContext) .resource } ConcurrentEffect[F[Throwable, ?]] MonadError[F[Throwable, ?], Throwable]
  • 27. IZUMI 1.0: SUMMARY CONCLUSION ‣ BIO provides a great set of TF abstractions ‣ DIStage is great for global/static contexts ‣ and ZIO's reader is perfect for local/dynamic contexts ‣ Izumi 1.0+ZIO is the most productive Scala stack ‣ And battle-tested ‣ There is no excuse not to use DIStage anymore ‣ Consider it for your next Scala project