Quickstart
Arrow aims to be the perfect companion to your Kotlin journey. That means it focuses on tasks most developers dealt with, like modifying data or managing resources. Given these aims, Arrow strives to provide idiomatic solutions and integrate with core Kotlin concepts such as coroutines.
Arrow is inspired by the great work made in other programming language communities, especially from functional, data-oriented and concurrent programming. This doesn't mean you need to know any of those ideas to use the libraries; Arrow exposes these concepts in ways that do not feel alien to Kotlin programmers.
- Look at the list of libraries and see how Arrow can help in your project
- Our summary is designed to help you find your way in the Arrow ecosystem.
- Look at some example projects using Arrow in both frontend and backend.
- Learn about design and architecture using functional and data-oriented programming concepts.
Enable the Maven Central repository
Arrow is published in Maven Central, so you need to enable it as a source of dependencies in your build.
- Gradle (Kotlin)
- Gradle (Groovy)
- Maven
repositories {
mavenCentral()
}
repositories {
mavenCentral()
}
Maven includes the Maven Central repository by default.
Include the dependencies
You're now ready to include Arrow in your project. You have three possibilities that correspond to three different ways of handling versioning in your build.
All Arrow libraries are Multiplatform-ready, so you can use them in all of your KMP projects. Be aware that some instructions here may need to be slightly changed in that situation.
One by one
Simply include the desired library in your dependencies
block or as a
<dependency>
if you're using Maven.
- Gradle (Kotlin)
- Gradle (Groovy)
- Maven
dependencies {
implementation("io.arrow-kt:arrow-core:1.2.4")
implementation("io.arrow-kt:arrow-fx-coroutines:1.2.4")
}
dependencies {
implementation 'io.arrow-kt:arrow-core:1.2.4'
implementation 'io.arrow-kt:arrow-fx-coroutines:1.2.4'
}
<dependency>
<groupId>io.arrow-kt</groupId>
<artifactId>arrow-core</artifactId>
<version>1.2.4</version>
</dependency>
<dependency>
<groupId>io.arrow-kt</groupId>
<artifactId>arrow-fx-coroutines</artifactId>
<version>1.2.4</version>
</dependency>
Using version catalogs
Version catalogs provide centralized management of versions. This is especially interesting when your Gradle build has several subprojects.
- libs.version.toml (Common)
- Gradle (Kotlin)
- Gradle (Groovy)
- Maven
[versions]
arrow = "1.2.4"
# other versions
[libraries]
arrow-core = { module = "io.arrow-kt:arrow-core", version.ref = "arrow" }
arrow-fx-coroutines = { module = "io.arrow-kt:arrow-fx-coroutines", version.ref = "arrow" }
# other dependencies
dependencies {
implementation(libs.arrow.core)
implementation(libs.arrow.fx.coroutines)
}
dependencies {
implementation(libs.arrow.core)
implementation(libs.arrow.fx.coroutines)
}
Version catalogs are only available in Gradle.
Using a Bill-of-Materials (BOM)
Another way to keep a single version for all Arrow dependencies in your build is
to include arrow-stack
, which declares versions for the rest of the components.
- Gradle (Kotlin)
- Gradle (Groovy)
- Maven
dependencies {
implementation(platform("io.arrow-kt:arrow-stack:1.2.4"))
// no versions on libraries
implementation("io.arrow-kt:arrow-core")
implementation("io.arrow-kt:arrow-fx-coroutines")
}
dependencies {
implementation platform('io.arrow-kt:arrow-stack:1.2.4')
// no versions on libraries
implementation 'io.arrow-kt:arrow-core'
implementation 'io.arrow-kt:arrow-fx-coroutines'
}
<dependency>
<groupId>io.arrow-kt</groupId>
<artifactId>arrow-stack</artifactId>
<version>1.2.4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- no versions on libraries -->
<dependency>
<groupId>io.arrow-kt</groupId>
<artifactId>arrow-core</artifactId>
</dependency>
<dependency>
<groupId>io.arrow-kt</groupId>
<artifactId>arrow-fx-coroutines</artifactId>
</dependency>
The Arrow team follows an eager dependency update policy. That means that Arrow libraries always depend on the most up-to-date version of the dependencies at the moment of release. In most cases, it is fine to use older versions of the dependencies; but in rare cases, the conflict leads to NoClassDefFoundError
s. If that happens, please try to update your dependencies to a more recent version, or open an issue.
Additional setup for plug-ins
If you're using the Optics component of Arrow, we provide a Kotlin compiler plug-in that can derive most of the boilerplate required to use it. This plug-in is built with KSP, which requires an additional configuration step.
- Gradle (Kotlin)
- Gradle (Groovy)
- Maven
plugins {
id("com.google.devtools.ksp") version "1.9.24-1.0.20"
}
dependencies {
implementation("io.arrow-kt:arrow-optics:1.2.4")
ksp("io.arrow-kt:arrow-optics-ksp-plugin:1.2.4")
}
plugins {
id 'com.google.devtools.ksp' version '1.9.24-1.0.20'
}
dependencies {
implementation 'io.arrow-kt:arrow-optics:1.2.4'
ksp 'io.arrow-kt:arrow-optics-ksp-plugin:1.2.4'
}
There's no official support for KSP in Maven. This project provides unofficial support for that scenario.
Plug-in for IntelliJ-based IDEs
If you are using an IntelliJ IDEA or any other IDE from JetBrains, we strongly recommend installing the Arrow plug-in. The plug-in helps fix common problems, especially in the realm of typed errors and suggests more idiomatic alternatives when available.
Alphas (development builds)
For those wanting to live on the edge, we provide alphas of our development
branch. Those are tagged with the upcoming
version, followed by -alpha.
and the sequence number of the compilation.
Check Maven Central
for the most recent list of available versions.