-
Notifications
You must be signed in to change notification settings - Fork 21
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Release for 2.0 #333
Open
serras
wants to merge
25
commits into
main
Choose a base branch
from
serras/arrow-2-0-everything
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+641
−239
Open
Release for 2.0 #333
Changes from all commits
Commits
Show all changes
25 commits
Select commit
Hold shift + click to select a range
263b5b0
Mention ArrowModule in serialization and ktor sections
tKe b9c81c0
remove kotlin tag on source blocks to avoid knit
tKe 116718b
Arrow 2.0 release notes
serras c28c5a6
Smaller updates to 2.0
serras 54dec11
Knit
serras 36a8df9
AwaitScope
serras b267808
Pattern matching DSL
serras fbfe9d1
More on pattern matching
serras 183ffe3
Finish pattern matching section
serras a58845f
Talk about accumulating
serras de555b1
Add information about new retry
serras 58844fd
Merge branch 'document-arrow-serializer-module' into serras/arrow-2-0…
serras 928d136
Merge branch 'serras/arrow-2-0' into serras/arrow-2-0-everything
serras ebdee04
Merge branch 'serras/updates-to-2-0' into serras/arrow-2-0-everything
serras a426fe6
Merge branch 'serras/pattern-matching' into serras/arrow-2-0-everything
serras d935b65
Links + Knit
serras 0279d12
Update to 2.0.0-alpha
serras 1b12c8a
Merge branch 'serras/2.0-alpha.4' into serras/arrow-2-0-everything
serras fde0980
Small fix to STM code
serras b9fc0e6
Use Knit in matching examples
serras 71cc9f0
Accumulation
serras f45caad
Remove mentions of pattern matching
serras 38e9cf2
Suggestions by @nomisRev
serras 744b11c
Merge branch 'main' into serras/arrow-2-0-everything
serras 6248e7e
Update to 2.0.0-beta.1
serras File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,172 @@ | ||
--- | ||
title: Arrow 2.0 release | ||
category: articles | ||
tags: [core, articles] | ||
--- | ||
|
||
# Arrow 2.0 release | ||
|
||
We are happy to announce the next major release of Arrow, version 2.0! | ||
|
||
This release is built with the new K2 compiler, and this gives us the ability | ||
to support a wider range of platforms, including WebAssembly. From now on, we shall | ||
provide artifacts for every platform supported by Kotlin. | ||
|
||
Apart from stabilization and general bug fixing, the theme of this release | ||
is improving the different DSLs provided by Arrow libraries. Our goal is to | ||
empower developers to write more succinct and readable code. | ||
|
||
* [Simple accumulation in Raise](#simple-accumulation-in-raise) (experimental) | ||
* [Additions to Fx](#additions-to-fx) | ||
* [Clearer retries for particular exceptions](#clearer-retries-for-particular-exceptions) | ||
* [Improved optics](#improved-optics) (breaking changes) | ||
* [Better support for kotlinx.serialization](#better-support-for-kotlinxserialization) | ||
|
||
## Upgrading to 2.0 | ||
|
||
As previously announced, migrating your projects to this release should be hassle-free | ||
if your code compiled in 1.2.x without any deprecation warnings. Note that we talk about | ||
**source** compatibility here, we had to break **binary** compatibility in several places | ||
to implement improvements, such as in `NonEmptyList` and [`Schedule`](https://github.com/arrow-kt/arrow/pull/3504). | ||
|
||
There are two exceptions to this seamless transition. First, it was discovered that some | ||
functions for `Map` in `Raise` collide with those of the standard library. Furthermore, | ||
Arrow's variants return other `Map`, whereas the ones in the standard library return `List`. | ||
The decision was to [rename them](https://github.com/arrow-kt/arrow/pull/3512/files#diff-b378045af72d02f1e5d4037d411102fcdb768239abeabedf69a4520b74ad0278). | ||
|
||
The second breaking change is related to [improved optics](#improved-optics), please | ||
consult that section for further information. | ||
|
||
## Simple accumulation in Raise | ||
|
||
One of the core concepts when working with typed errors is the distinction | ||
between fail-first and [accumulation of errors](/learn/typed-errors/working-with-typed-errors/#accumulating-different-computations). Until now, the latter mode | ||
required using `zipOrAccumulate` and `mapOrAccumulate`, which sometimes obscure the actual | ||
flow of the computation. | ||
|
||
In Arrow 2.0 we have sprinkled some DSL dust over `Raise`, and now you can | ||
write your code in a more linear way. Inside an `accumulate` block (or in | ||
general, any `RaiseAccumulate`) you use `by accumulating` to execute some | ||
computation keeping all the errors. | ||
|
||
```kotlin | ||
// version with `zipOrAccumulate` | ||
zipOrAccumulate( | ||
{ checkOneThing() }, | ||
{ checkOtherThing() } | ||
) { a, b -> doSomething(a, b) } | ||
|
||
// version with `accumulate` | ||
accumulate { | ||
val a by accumulating { checkOneThing() } | ||
val b by accumulating { checkOtherThing() } | ||
doSomething(a, b) | ||
} | ||
``` | ||
|
||
This DSL also includes shortcuts for the most common operations, like | ||
`bind`ing and accumulating any problem, or checking a single property | ||
of some data. | ||
|
||
```kotlin | ||
accumulate { | ||
val name by Name(rawName).bindOrAccumulate() | ||
ensureOrAccumulate(age >= 18) { UnderAge } | ||
Person(name, age) | ||
} | ||
``` | ||
|
||
Note that the API may still undergo some change. At this point you need `@OptIn(ExperimentalRaiseAccumulateApi::class)` to allow their usage in your code. | ||
|
||
## Additions to Fx | ||
|
||
Writing coroutine-heavy code may become cumbersome over time, especially if | ||
one intends to use as much concurrency as possible. Arrow Fx includes a `parZip` | ||
function, but not everybody enjoys having so many brackets. | ||
|
||
```kotlin | ||
parZip( | ||
{ downloadFile() }, | ||
{ loadDataFromDatabase() } | ||
) { file, data -> Result(file, data) } | ||
``` | ||
|
||
The new [`awaitAll` scope](/learn/coroutines/parallel/#await-all-scopes) tries to improve the situation by tweaking the | ||
usual `async` mechanism, ensuring that all `Deferred` values are `await`ed | ||
once the first one is requested. That means that the previous code behaves | ||
identically to the following, that is, the call `file.await()` implicitly | ||
awaits every `async` defined up to that point. | ||
|
||
```kotlin | ||
awaitAll { | ||
val file = async { downloadFile() } | ||
val data = async { loadDataFromDatabase() } | ||
Result(file.await(), data.await()) | ||
} | ||
``` | ||
|
||
We've also improved the STM block by [allowing delegation](/learn/coroutines/stm/#reading-and-writing-concurrent-state) as a means to | ||
read or change the value of a `TVar`. | ||
|
||
```kotlin | ||
fun STM.deposit(accVar: TVar<Int>, amount: Int): Unit { | ||
val acc by accVar // delegation here | ||
val current = acc // implicit 'read' | ||
acc = current + amount // implicit 'write' | ||
} | ||
``` | ||
|
||
## Clearer retries for particular exceptions | ||
|
||
Until now, the [`retry` operation](/learn/resilience/retry-and-repeat/) in the Resilience module would capture | ||
any `Throwable` exception. From version 2.0 on you can specify a subclass | ||
of `Throwable` to be the target for retrying, whereas the rest of | ||
exceptions will bubble as usual. | ||
|
||
```kotlin | ||
Schedule.recurs<Throwable>(2) | ||
.retry<IllegalArgumentException, _> { ... } | ||
``` | ||
|
||
The subclass of exceptions must be given as a type argument. | ||
Alas, Kotlin does not allow giving only a subset of those, and `retry` | ||
has two type parameters (the second one represents the output type of | ||
the `Schedule`). Fortunately, you can ask the compiler to infer the | ||
second one using `_`. | ||
|
||
## Improved optics | ||
|
||
The largest **breaking changes** in Arrow 2.0 relate to optics. | ||
First of all, the [optics hierarchy](/learn/immutable-data/intro/#many-optics-to-rule-them-all) has been greatly simplified: | ||
now we have traversals, optionals, lenses, prisms, and isos, and no more | ||
intermediate types. This smaller amount of types means that the type of | ||
optic compositions become easier to understand. | ||
|
||
We have also changed the generation of optics via the compiler plug-in | ||
(that is, the `@optics` annotation) with respect to nullable fields. | ||
In the 1.x series, a value of type `String?` would be presented as | ||
`Optional<T, String>`; this makes impossible to change the value from | ||
`null` to an actual `String` using only optics operations. From version | ||
2.0, that field is represented as `Lens<T, String?>`. To get the 1.x | ||
behavior you should apply `.notNull` after the optic corresponding to | ||
the field. | ||
|
||
A smaller breaking change is that generated optics are no longer | ||
[inlined by default](https://github.com/arrow-kt/arrow/pull/3505). | ||
This should prevent a large amount of warnings in which the compiler | ||
complain that inlining is not significant. Note that the previous behavior | ||
is still available under a flag. | ||
|
||
One pain point when building [traversals](/learn/immutable-data/traversal/) was the need to provide an | ||
argument to `.every`, like `.every(Every.list())`. This new version | ||
brings an improved variant that requires no arguments if the type | ||
of the `Iterable` is known. Similar improvements have been applied | ||
to `.at` and `.index`. | ||
|
||
## Better support for kotlinx.serialization | ||
|
||
Using Arrow Core data types as part of serialized data requires additional integration. | ||
In 1.2.x we started providing compile-time [support for `kotlinx.serialization`](/learn/quickstart/serialization/#kotlinxserialization). | ||
From 2.0 on we also provide `ArrowModule` for | ||
[contextual serialization](https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/serializers.md#contextual-serialization). This is needed, among others, when the data is processed | ||
by Ktor. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we need to add the details why this is important for
Raise
, or how not using this could result in hanging?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do you have a 1-sentence summary of this I could use?