Skip to content
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

[PROPOSAL] Either API deprecation, and preparation for 2.x.x #2830

Merged
merged 24 commits into from
Nov 17, 2022

Conversation

nomisRev
Copy link
Member

@nomisRev nomisRev commented Sep 28, 2022

This PR proposes a smaller API surface for Either without compromising any of its functionality, or feature set.
The goal of these changes is to offer APIs that are more powerful, and more idiomatic to use in Kotlin. Following the signatures and naming of some other well-know APIs from Kotlin Std, or KotlinX Coroutines

The PR reduces the API surface from 70 functions, to 16. Which means the learning curve would be drastically reduced, and learning to work with Either will be significantly simpler.

The list below describes the changes found in this PR for simpler reviewing. All community feedback is welcome, if you're (heavily) using one of these APIs then please comment your use-cases below. Some other APIs are still up for discussion, and they're marked with an "// TODO open-question" comment in the PR. Those APIs are currently not up for deprecation, but might be considered for deprecation in the future.

Either (API Size 70 -> 16)

(Bi)Functor / Applicative / Monad (API Size 15 -> 5)

Keep

map: transform right value
onRight: peek right value
flatMap: transform right value with Either + flatten
flatten: flatten nested eithers.
widen: conveniently change the generic parameters to a super class type.

Remove

replicate -> replace with map { List(n) { it } }
exists -> fold({ false }, predicate) // map(predicate).getOrElse { false }
all -> fold({ true }, predicate) // map(predicate).getOrElse { true }
void -> Use map { }
findOrNull => Kotlin nullable syntax: orNull()?.takeIf(predicate)
filterOrElse => Use DSL + ensure, flatMap + if-else
filterOrOther => Use DSL + ensure, flatMap + if-else
ensure => Use DSL + ensure, flatMap + if-else
contains => fold({ false }) { it == elem }
bimap -> map . recover or bind + recover, or recover inside DSL, ...
widenLeft -> widen covers both left, and right generic parameter.
​​tap -> onRight, to be more in line with Kotlin Std

Replaced

zip -> Replaced with Validated behavior, original zip will be inline either + bind

Applicative/MonadError (API Size 9 -> 4)

New

recover: DSL powered version of handleErrorWith signature
catch: DSL powered version of handleErrorWith specific for working with Throwable

Keep

mapLeft: map error
onLeft: peek left value
getOrElse: extract & transform error value to success type

Remove

combineK -> recover { other.bind() }
handleErrorWith -> recover { transform(it).bind() }
handleError -> recover { transform(it) }
redeem -> map(transformValue).recover { transformError(it) }
redeemWith -> fold(transformError, transformValue)
getOrHandle -> duplicate: use getOrElse
tapLeft -> onLeft, to be more in line with Kotlin Std

Foldable / (Bi)Traverse (API Size 27 -> 2)

Keep

fold -> Alternative to when
merge -> E == A, extract value.

Remove

foldLeft -> replace with fold
foldMap -> replace with fold
bifoldLeft -> replace with fold
bifoldMap -> replace with fold

  • All of the traverse methods can be replaced by a simple fold, or even simpler by orNull, getOrElse in a bunch of cases.

    sequence
    sequenceOption
    sequence
    sequenceNullable
    sequence
    sequenceValidated
    sequence
    bisequence
    bisequenceOption
    bisequenceNullable
    bisequenceValidated
    traverse
    traverse
    traverseOption
    traverseNullable
    traverse
    traverseValidated
    bitraverse
    bitraverseOption
    bitraverseNullable
    bitraverseValidated

Utilities (19 -> 5)

Keep

swap -> Flip type arguments
getOrNull: extract value, or return null
getOrNone: extract value, or return None

isRight() -> Add smart-contracts, alternative to when
isLeft() -> Add smart-contracts, altenative to when
compareTo -> Add Comparable operators for Either type

Remove

orNone() -> use getOrNone
​orNull -> use getOrNull

rightIfNotNull -> this?.right() ?: default().left()
rightIfNull -> this?.let { default().left() } ?: null.right()
leftIfNull -> DSL+ensureNotNull or flatMap { b -> b?.right() ?: default().left() }

isNotEmpty -> duplicate: use isRight()
isEmpty -> duplicate: use isLeft()
isLeft -> duplicate: use isLeft()
isRight -> duplicate: use isRight()

combineAll -> fold(Monoid.either(MA, MB))
combine -> Will be covered by accumulating zip behavior in 2.x.x

toValidatedNel: Validated removed in Arrow 2.x.x
toValidated: Validated removed in Arrow 2.x.x

@nomisRev nomisRev requested a review from a team September 28, 2022 09:08
@nomisRev nomisRev changed the title Wip either api [PROPOSAL] Either API deprecation, and preparation for 2.x.x Sep 28, 2022
@sksamuel
Copy link
Collaborator

tap might be named onRight which would align with the kotlin sdk names for things like onEach, onComplete, onSuccess, onFailure. Similarly tapLeft could be onLeft.

orNull could be getOrNull to align with Result.

@raulraja
Copy link
Member

LGTM @nomisRev !, great work!

@nomisRev
Copy link
Member Author

Those are great suggestions @sksamuel, onXXX also better indicates that it's a side-effect whilst tapXXX doesn't perse. Aligning more with Kotlin Std is always a win in my book, since it also helps reducing surprise factor and learning curve.

@JavierSegoviaCordoba
Copy link
Member

About orNull, Gradle uses it on properties and I always forget it because I look for getOrNull. Big +1 for that.

@myuwono
Copy link
Collaborator

myuwono commented Sep 29, 2022

either.orNone() is a really useful function for option interop. Hopefully we can keep it. 🙏

@nomisRev
Copy link
Member Author

nomisRev commented Oct 3, 2022

@myuwono, thanks for your feedback 🙏

We've already kept this in mind, but I wanted to list it here explicitly anyways. And I'd like to pick your brain because I know you've worked a lot with Arrow's Option (in combination with Project Reactor).

I am wondering if you're experiencing a lack of Option APIs in other places? This is my concern about Option APIs actually, because I don't think that having getOrNull() increases the learning curve but it might increase the need for having Option specific APIs everywhere. Or do you think that the current balance we've already struck in 1.x.x is sufficient for all your use-case?

Secondary concern that people might use Option over nullable without actually having a need for it. Option should only be used with Project Reactor, RxJava or in generic code that is not constrained to A & Any.

PS: I assume you'd be okay with a orNone -> getOrNone rename as suggested for the nullable one above.

@nomisRev
Copy link
Member Author

nomisRev commented Oct 3, 2022

@JavierSegoviaCordoba @sksamuel thanks for the great feedback & help shaping Arrow 2.x.x together 🙏

I added onRight and onLeft and deprecated tap & tapLeft accordingly. Much more descriptive, and idiomatic Kotlin names. I made the same change for orNull -> getOrNull 👍

@nomisRev nomisRev marked this pull request as ready for review November 17, 2022 10:51
@Zordid
Copy link
Contributor

Zordid commented Jan 18, 2023

While I appreciate a cleaner API in general, I really doubt the learning curve for my colleagues will be better if they see code like this:

flatMap { b -> b?.right() ?: default().left() }

instead of the much more understandable leftIfNull...

Even I have to twist my brain around all of the noise characters here instead of just reading what is meant. So, I got REALLY annoyed when I saw these deprecations in 1.1.5

Do you really think that it's wise to now let many people write their own extensions to bring back the ease of reading into their code?

@nomisRev
Copy link
Member Author

nomisRev commented Jan 18, 2023

Hey @Zordid,

Thank you for your feedback. flatMap { b -> b?.right() ?: default().left() } is not what we had in mind when deprecating this API but sadly ReplaceWith is quite limited in what it can do 😞

We consider the following code to be Arrow & Kotlin idiomatic. It leverages both the Arrow DSL, and Kotlin smart casting to offer an elegant and Kotlin idiomatic API.

either {
  val b: B? = bind()
  ensureNotNull(b) { default() }
  // b is smart-casted to non-null
}

This snippet is however not possible to be used with Kotlin's ReplaceWith and we think it offers a much more consistent and idiomatic API over leftIfNull.

Out of our own experience working on many projects with Kotlin & Arrow we felt these APIs are really confusing, and hard to learn for people not familiar with FP. Additionally, we've not used these methods in many years since the APIs were added that were shown above.

After asking for feedback on Slack, Github and Twitter we felt that most users were in agreement on this. If there are a couple APIs you extensively use, adding an extension method is always a good option. Otherwise feel free to open a Github issue for a specific API you think should remain towards 2.0.0 and we can discuss in more detail there to consider keeping it for 2.0.0.

sschaeffner added a commit to fabXlabs/fabX that referenced this pull request Feb 3, 2023
@uliSchuster
Copy link

Without the ifNotNull extension functions, what would be a idiomatic way to write the following:

either {
    val sender = (cElem.findElementString(Tag.Sender)?.right() ?: MissingDataElementError(Tag.Sender).left()).bind()
    val receiver = (cElem.findElementString(Tag.Receiver)?.right() ?: MissingDataElementError(Tag.Receiver).left()).bind()
    Transmitter(sender, receiver)
}

Wrapping the entire expression in parenthesis just to call bind() on it immediately doesn't feel right

@serras
Copy link
Member

serras commented Feb 6, 2023

@uliSchuster The easiest way would be

either {
  val sender = cElem.findElementString(Tag.Sender) ?: raise(MissingDataElementError(Tag.Sender))
  val receiver = cElem.findElementString(Tag.Receiver) ?: raise(MissingDataElementError(Tag.Receiver))
  Transmitter(sender, receiver)
}

@uliSchuster
Copy link

How about the corresponding functions for Validated and ValidatedNel; e.g., invalidNelIfNull()? Will they be deprecated as well? To keep the API consistent, this would seem consequential. But what would be an idiomatic Kotlin replacement?

@nomisRev
Copy link
Member Author

nomisRev commented Feb 6, 2023

The idiomatic way is actually using the ensureNotNull API in the DSL with Kotlin's smart-casting also available.

either {
    val sender = ensureNotNull(cElem.findElementString(Tag.Sender)) { MissingDataElementError(Tag.Sender) }
    val receiver = ensureNotNull(cElem.findElementString(Tag.Receiver)) { MissingDataElementError(Tag.Receiver }
    Transmitter(sender, receiver)
}

@nomisRev
Copy link
Member Author

nomisRev commented Feb 6, 2023

How about the corresponding functions for Validated and ValidatedNel; e.g., invalidNelIfNull()? Will they be deprecated as well? To keep the API consistent, this would seem consequential. But what would be an idiomatic Kotlin replacement?

Validated will get deprecated, and flattened into Either towards 2.x.x. Any feedback is greatly appreciated 🙏

Some relevant PRs:

github-merge-queue bot referenced this pull request in elide-dev/elide Jul 23, 2023
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [io.arrow-kt:arrow-fx-coroutines](https://github.com/arrow-kt/arrow)
| `1.1.3` -> `1.2.0` |
[![age](https://developer.mend.io/api/mc/badges/age/maven/io.arrow-kt:arrow-fx-coroutines/1.2.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/maven/io.arrow-kt:arrow-fx-coroutines/1.2.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/maven/io.arrow-kt:arrow-fx-coroutines/1.1.3/1.2.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/io.arrow-kt:arrow-fx-coroutines/1.1.3/1.2.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[io.arrow-kt:arrow-optics-ksp-plugin](https://github.com/arrow-kt/arrow)
| `1.1.3` -> `1.2.0` |
[![age](https://developer.mend.io/api/mc/badges/age/maven/io.arrow-kt:arrow-optics-ksp-plugin/1.2.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/maven/io.arrow-kt:arrow-optics-ksp-plugin/1.2.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/maven/io.arrow-kt:arrow-optics-ksp-plugin/1.1.3/1.2.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/io.arrow-kt:arrow-optics-ksp-plugin/1.1.3/1.2.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [io.arrow-kt:arrow-optics](https://github.com/arrow-kt/arrow) |
`1.1.3` -> `1.2.0` |
[![age](https://developer.mend.io/api/mc/badges/age/maven/io.arrow-kt:arrow-optics/1.2.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/maven/io.arrow-kt:arrow-optics/1.2.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/maven/io.arrow-kt:arrow-optics/1.1.3/1.2.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/io.arrow-kt:arrow-optics/1.1.3/1.2.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [io.arrow-kt:arrow-core](https://github.com/arrow-kt/arrow) |
`1.1.3` -> `1.2.0` |
[![age](https://developer.mend.io/api/mc/badges/age/maven/io.arrow-kt:arrow-core/1.2.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/maven/io.arrow-kt:arrow-core/1.2.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/maven/io.arrow-kt:arrow-core/1.1.3/1.2.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/io.arrow-kt:arrow-core/1.1.3/1.2.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [io.arrow-kt:arrow-stack](https://github.com/arrow-kt/arrow) |
`1.1.3` -> `1.2.0` |
[![age](https://developer.mend.io/api/mc/badges/age/maven/io.arrow-kt:arrow-stack/1.2.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/maven/io.arrow-kt:arrow-stack/1.2.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/maven/io.arrow-kt:arrow-stack/1.1.3/1.2.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/io.arrow-kt:arrow-stack/1.1.3/1.2.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### ⚠ Dependency Lookup Warnings ⚠

Warnings were logged while processing this repo. Please check the
Dependency Dashboard for more information.

---

### Release Notes

<details>
<summary>arrow-kt/arrow (io.arrow-kt:arrow-fx-coroutines)</summary>

### [`v1.2.0`](https://github.com/arrow-kt/arrow/releases/tag/1.2.0)

[Compare
Source](https://github.com/arrow-kt/arrow/compare/1.1.5...1.2.0)

##### What's Changed

- Add CNAME file to Dokka output by
[@&#8203;franciscodr](https://github.com/franciscodr) in
[https://github.com/arrow-kt/arrow/pull/3029](https://github.com/arrow-kt/arrow/pull/3029)
- Remove legacy site code by
[@&#8203;nomisRev](https://github.com/nomisRev) in
[https://github.com/arrow-kt/arrow/pull/3030](https://github.com/arrow-kt/arrow/pull/3030)
- Update README by [@&#8203;serras](https://github.com/serras) in
[https://github.com/arrow-kt/arrow/pull/3033](https://github.com/arrow-kt/arrow/pull/3033)
- Cancel previous PR action on new commit by
[@&#8203;nomisRev](https://github.com/nomisRev) in
[https://github.com/arrow-kt/arrow/pull/3032](https://github.com/arrow-kt/arrow/pull/3032)
- Remove legacy script files by
[@&#8203;franciscodr](https://github.com/franciscodr) in
[https://github.com/arrow-kt/arrow/pull/3034](https://github.com/arrow-kt/arrow/pull/3034)
- Ensure optics type with "data" modifier is a class by
[@&#8203;DeoTimeTheGithubUser](https://github.com/DeoTimeTheGithubUser)
in
[https://github.com/arrow-kt/arrow/pull/3036](https://github.com/arrow-kt/arrow/pull/3036)
- Update all dependencies (major) by
[@&#8203;renovate](https://github.com/renovate) in
[https://github.com/arrow-kt/arrow/pull/3042](https://github.com/arrow-kt/arrow/pull/3042)
- Remove test dependency from Arrow Fx by
[@&#8203;nomisRev](https://github.com/nomisRev) in
[https://github.com/arrow-kt/arrow/pull/3046](https://github.com/arrow-kt/arrow/pull/3046)
- Bump Kotlin, KSP and coroutines version by
[@&#8203;nomisRev](https://github.com/nomisRev) in
[https://github.com/arrow-kt/arrow/pull/3047](https://github.com/arrow-kt/arrow/pull/3047)
- fix mapIndexed when collecting multiple times by
[@&#8203;hoc081098](https://github.com/hoc081098) in
[https://github.com/arrow-kt/arrow/pull/3056](https://github.com/arrow-kt/arrow/pull/3056)
- Update versions by [@&#8203;nomisRev](https://github.com/nomisRev)
in
[https://github.com/arrow-kt/arrow/pull/3058](https://github.com/arrow-kt/arrow/pull/3058)
- optics ksp plugin: fixed handling of variance
([#&#8203;3057](https://github.com/arrow-kt/arrow/issues/3057)) by
[@&#8203;vladd-g](https://github.com/vladd-g) in
[https://github.com/arrow-kt/arrow/pull/3060](https://github.com/arrow-kt/arrow/pull/3060)
- Fixes recover inconsistency with raise DSL on types other than Either
by [@&#8203;yoxjames](https://github.com/yoxjames) in
[https://github.com/arrow-kt/arrow/pull/3052](https://github.com/arrow-kt/arrow/pull/3052)
- Change NonEmptySet type parameter name from T to A by
[@&#8203;franciscodr](https://github.com/franciscodr) in
[https://github.com/arrow-kt/arrow/pull/3062](https://github.com/arrow-kt/arrow/pull/3062)
- Add withError and (Eager)Effect.mapError by
[@&#8203;kyay10](https://github.com/kyay10) in
[https://github.com/arrow-kt/arrow/pull/3059](https://github.com/arrow-kt/arrow/pull/3059)
- Update versions of several libraries by
[@&#8203;serras](https://github.com/serras) in
[https://github.com/arrow-kt/arrow/pull/3017](https://github.com/arrow-kt/arrow/pull/3017)
- Add merge builder for raise by
[@&#8203;kyay10](https://github.com/kyay10) in
[https://github.com/arrow-kt/arrow/pull/3061](https://github.com/arrow-kt/arrow/pull/3061)
- Update all dependencies by
[@&#8203;renovate](https://github.com/renovate) in
[https://github.com/arrow-kt/arrow/pull/3065](https://github.com/arrow-kt/arrow/pull/3065)
- Update dependency gradle to v8.2 by
[@&#8203;renovate](https://github.com/renovate) in
[https://github.com/arrow-kt/arrow/pull/3070](https://github.com/arrow-kt/arrow/pull/3070)
- Fix warnings of single-subclass sealed classes by
[@&#8203;jooohn](https://github.com/jooohn) in
[https://github.com/arrow-kt/arrow/pull/3067](https://github.com/arrow-kt/arrow/pull/3067)
- KDoc for `Raise#raise`, `Raise#ensure` and `Raise#ensureNotNull` by
[@&#8203;ILIYANGERMANOV](https://github.com/ILIYANGERMANOV) in
[https://github.com/arrow-kt/arrow/pull/3038](https://github.com/arrow-kt/arrow/pull/3038)
- Fix text repetition in EffectScope's deprecation message by
[@&#8203;serras](https://github.com/serras) in
[https://github.com/arrow-kt/arrow/pull/3072](https://github.com/arrow-kt/arrow/pull/3072)
- Introduce `NonEmptyCollection` by
[@&#8203;serras](https://github.com/serras) in
[https://github.com/arrow-kt/arrow/pull/3068](https://github.com/arrow-kt/arrow/pull/3068)
- Set up Spotless by [@&#8203;serras](https://github.com/serras) in
[https://github.com/arrow-kt/arrow/pull/3075](https://github.com/arrow-kt/arrow/pull/3075)
- Update all dependencies by
[@&#8203;renovate](https://github.com/renovate) in
[https://github.com/arrow-kt/arrow/pull/3079](https://github.com/arrow-kt/arrow/pull/3079)
- Add option to disable `inline` when using `@optics` by
[@&#8203;serras](https://github.com/serras) in
[https://github.com/arrow-kt/arrow/pull/3078](https://github.com/arrow-kt/arrow/pull/3078)
- Update JS versions in `yarn.lock` by
[@&#8203;serras](https://github.com/serras) in
[https://github.com/arrow-kt/arrow/pull/3084](https://github.com/arrow-kt/arrow/pull/3084)
- Enable Automatic Modules for JVM by
[@&#8203;serras](https://github.com/serras) in
[https://github.com/arrow-kt/arrow/pull/3071](https://github.com/arrow-kt/arrow/pull/3071)
- Serialization module by [@&#8203;serras](https://github.com/serras)
in
[https://github.com/arrow-kt/arrow/pull/3077](https://github.com/arrow-kt/arrow/pull/3077)
- Add missing docs for `Raise` operations by
[@&#8203;serras](https://github.com/serras) in
[https://github.com/arrow-kt/arrow/pull/3082](https://github.com/arrow-kt/arrow/pull/3082)
- Add mapOrAccumulate extension in RaiseAccumulate by
[@&#8203;nomisRev](https://github.com/nomisRev) in
[https://github.com/arrow-kt/arrow/pull/3086](https://github.com/arrow-kt/arrow/pull/3086)
- Additional tests for `copy` in Optics by
[@&#8203;serras](https://github.com/serras) in
[https://github.com/arrow-kt/arrow/pull/3089](https://github.com/arrow-kt/arrow/pull/3089)
- Apply Gradle Versioning in top project by
[@&#8203;serras](https://github.com/serras) in
[https://github.com/arrow-kt/arrow/pull/3092](https://github.com/arrow-kt/arrow/pull/3092)
- Add missing Versioning plug-in to `arrow-core-retrofit` by
[@&#8203;serras](https://github.com/serras) in
[https://github.com/arrow-kt/arrow/pull/3093](https://github.com/arrow-kt/arrow/pull/3093)
- Update `arrow-gradle-config` to 0.12-rc.4 by
[@&#8203;serras](https://github.com/serras) in
[https://github.com/arrow-kt/arrow/pull/3094](https://github.com/arrow-kt/arrow/pull/3094)
- MemoizedDeepRecursiveFunction by
[@&#8203;serras](https://github.com/serras) in
[https://github.com/arrow-kt/arrow/pull/3091](https://github.com/arrow-kt/arrow/pull/3091)
- Add reset and barrierAction to CyclicBarrier. by
[@&#8203;HSAR](https://github.com/HSAR) in
[https://github.com/arrow-kt/arrow/pull/3055](https://github.com/arrow-kt/arrow/pull/3055)
- \[HOTFIX] Fix main publish by
[@&#8203;nomisRev](https://github.com/nomisRev) in
[https://github.com/arrow-kt/arrow/pull/3095](https://github.com/arrow-kt/arrow/pull/3095)

##### New Contributors

-
[@&#8203;DeoTimeTheGithubUser](https://github.com/DeoTimeTheGithubUser)
made their first contribution in
[https://github.com/arrow-kt/arrow/pull/3036](https://github.com/arrow-kt/arrow/pull/3036)
- [@&#8203;vladd-g](https://github.com/vladd-g) made their first
contribution in
[https://github.com/arrow-kt/arrow/pull/3060](https://github.com/arrow-kt/arrow/pull/3060)
- [@&#8203;yoxjames](https://github.com/yoxjames) made their first
contribution in
[https://github.com/arrow-kt/arrow/pull/3052](https://github.com/arrow-kt/arrow/pull/3052)
- [@&#8203;kyay10](https://github.com/kyay10) made their first
contribution in
[https://github.com/arrow-kt/arrow/pull/3059](https://github.com/arrow-kt/arrow/pull/3059)
- [@&#8203;jooohn](https://github.com/jooohn) made their first
contribution in
[https://github.com/arrow-kt/arrow/pull/3067](https://github.com/arrow-kt/arrow/pull/3067)
- [@&#8203;ILIYANGERMANOV](https://github.com/ILIYANGERMANOV) made
their first contribution in
[https://github.com/arrow-kt/arrow/pull/3038](https://github.com/arrow-kt/arrow/pull/3038)
- [@&#8203;HSAR](https://github.com/HSAR) made their first
contribution in
[https://github.com/arrow-kt/arrow/pull/3055](https://github.com/arrow-kt/arrow/pull/3055)

**Full Changelog**:
arrow-kt/arrow@1.2.0-RC...1.2.0

### [`v1.1.5`](https://github.com/arrow-kt/arrow/releases/tag/1.1.5)

[Compare
Source](https://github.com/arrow-kt/arrow/compare/1.1.4...1.1.5)

#### What's Changed

- Remove `test` modules by [@&#8203;serras](https://github.com/serras)
in
[https://github.com/arrow-kt/arrow/pull/2874](https://github.com/arrow-kt/arrow/pull/2874)
- Mention Arrow 2.0 in README by
[@&#8203;serras](https://github.com/serras) in
[https://github.com/arrow-kt/arrow/pull/2878](https://github.com/arrow-kt/arrow/pull/2878)
- Prisms for Either by [@&#8203;serras](https://github.com/serras) in
[https://github.com/arrow-kt/arrow/pull/2877](https://github.com/arrow-kt/arrow/pull/2877)
- Test 1.8.0 on CI by [@&#8203;nomisRev](https://github.com/nomisRev)
in
[https://github.com/arrow-kt/arrow/pull/2864](https://github.com/arrow-kt/arrow/pull/2864)
- Implement 'align' using 'buildList' by
[@&#8203;serras](https://github.com/serras) in
[https://github.com/arrow-kt/arrow/pull/2886](https://github.com/arrow-kt/arrow/pull/2886)
- Improve debugging experience of leaked shift calls by
[@&#8203;nomisRev](https://github.com/nomisRev) in
[https://github.com/arrow-kt/arrow/pull/2884](https://github.com/arrow-kt/arrow/pull/2884)
- Fix knitCheck & re-add check by
[@&#8203;nomisRev](https://github.com/nomisRev) in
[https://github.com/arrow-kt/arrow/pull/2887](https://github.com/arrow-kt/arrow/pull/2887)

**Full Changelog**:
arrow-kt/arrow@1.1.4...1.1.5

### [`v1.1.4`](https://github.com/arrow-kt/arrow/releases/tag/1.1.4)

[Compare
Source](https://github.com/arrow-kt/arrow/compare/1.1.3...1.1.4)

#### What's Changed

- \[2743] Migrate internal use of CircuitBreaker double to duration by
[@&#8203;mjmoore](https://github.com/mjmoore) in
[https://github.com/arrow-kt/arrow/pull/2748](https://github.com/arrow-kt/arrow/pull/2748)
- Fix typo by [@&#8203;valery1707](https://github.com/valery1707) in
[https://github.com/arrow-kt/arrow/pull/2824](https://github.com/arrow-kt/arrow/pull/2824)
- Make the server disconnect test more general by
[@&#8203;lukasz-kalnik-gcx](https://github.com/lukasz-kalnik-gcx) in
[https://github.com/arrow-kt/arrow/pull/2822](https://github.com/arrow-kt/arrow/pull/2822)
- Update NonEmptyList.fromList deprecation to suggest `toOption()`
instead by [@&#8203;StylianosGakis](https://github.com/StylianosGakis)
in
[https://github.com/arrow-kt/arrow/pull/2832](https://github.com/arrow-kt/arrow/pull/2832)
- Improve Either.getOrHandle() docs by
[@&#8203;lukasz-kalnik-gcx](https://github.com/lukasz-kalnik-gcx) in
[https://github.com/arrow-kt/arrow/pull/2833](https://github.com/arrow-kt/arrow/pull/2833)
- Correct `addressStrees` -> `addressStreet` in optics documentation by
[@&#8203;vikrem](https://github.com/vikrem) in
[https://github.com/arrow-kt/arrow/pull/2836](https://github.com/arrow-kt/arrow/pull/2836)
- Arrow Fx: deprecate Platform#composeError, never and unit() by
[@&#8203;nomisRev](https://github.com/nomisRev) in
[https://github.com/arrow-kt/arrow/pull/2837](https://github.com/arrow-kt/arrow/pull/2837)
- Backport Optics KSP plugin NPE on multiplatform fix by
[@&#8203;cvb941](https://github.com/cvb941) in
[https://github.com/arrow-kt/arrow/pull/2840](https://github.com/arrow-kt/arrow/pull/2840)
- Refactor -
[#&#8203;2812](https://github.com/arrow-kt/arrow/issues/2812) sequence
separate performance by [@&#8203;Khepu](https://github.com/Khepu) in
[https://github.com/arrow-kt/arrow/pull/2818](https://github.com/arrow-kt/arrow/pull/2818)
- Use `super` equals and hashCode overrides for NonEmptyList by
[@&#8203;RusticFlare](https://github.com/RusticFlare) in
[https://github.com/arrow-kt/arrow/pull/2825](https://github.com/arrow-kt/arrow/pull/2825)
- Resource API deprecation, and preparation for 2.x.x. & back port
improvements by [@&#8203;nomisRev](https://github.com/nomisRev) in
[https://github.com/arrow-kt/arrow/pull/2847](https://github.com/arrow-kt/arrow/pull/2847)
- introduce iterable.toNonEmptyListOrNone() by
[@&#8203;myuwono](https://github.com/myuwono) in
[https://github.com/arrow-kt/arrow/pull/2843](https://github.com/arrow-kt/arrow/pull/2843)
- \[PROPOSAL] Either API deprecation, and preparation for 2.x.x by
[@&#8203;nomisRev](https://github.com/nomisRev) in
[https://github.com/arrow-kt/arrow/pull/2830](https://github.com/arrow-kt/arrow/pull/2830)
- Use major versions in GitHub Actions by
[@&#8203;serras](https://github.com/serras) in
[https://github.com/arrow-kt/arrow/pull/2849](https://github.com/arrow-kt/arrow/pull/2849)
- Weaken Either monoid dependencies to only require a semigroup on left
by [@&#8203;mjvmroz](https://github.com/mjvmroz) in
[https://github.com/arrow-kt/arrow/pull/2845](https://github.com/arrow-kt/arrow/pull/2845)
- Do not reuse the name of the file in Optics KSP by
[@&#8203;serras](https://github.com/serras) in
[https://github.com/arrow-kt/arrow/pull/2850](https://github.com/arrow-kt/arrow/pull/2850)
- Additional deprecations, and backports for JVM by
[@&#8203;nomisRev](https://github.com/nomisRev) in
[https://github.com/arrow-kt/arrow/pull/2856](https://github.com/arrow-kt/arrow/pull/2856)
- Update various versions by
[@&#8203;serras](https://github.com/serras) in
[https://github.com/arrow-kt/arrow/pull/2852](https://github.com/arrow-kt/arrow/pull/2852)
- Add CountDownLatch by
[@&#8203;nomisRev](https://github.com/nomisRev) in
[https://github.com/arrow-kt/arrow/pull/2854](https://github.com/arrow-kt/arrow/pull/2854)
- Add CyclicBarrier by [@&#8203;nomisRev](https://github.com/nomisRev)
in
[https://github.com/arrow-kt/arrow/pull/2857](https://github.com/arrow-kt/arrow/pull/2857)
- Temp rollback error handling deprecations until 1.2.x by
[@&#8203;nomisRev](https://github.com/nomisRev) in
[https://github.com/arrow-kt/arrow/pull/2858](https://github.com/arrow-kt/arrow/pull/2858)
- Setup Kover as test coverage tool by
[@&#8203;MarkMarkyMarkus](https://github.com/MarkMarkyMarkus) in
[https://github.com/arrow-kt/arrow/pull/2793](https://github.com/arrow-kt/arrow/pull/2793)
- Fix Monad.either binary combat by
[@&#8203;nomisRev](https://github.com/nomisRev) in
[https://github.com/arrow-kt/arrow/pull/2867](https://github.com/arrow-kt/arrow/pull/2867)
- Backport: MPP No Trace by
[@&#8203;nomisRev](https://github.com/nomisRev) in
[https://github.com/arrow-kt/arrow/pull/2869](https://github.com/arrow-kt/arrow/pull/2869)

#### New Contributors

- [@&#8203;mjmoore](https://github.com/mjmoore) made their first
contribution in
[https://github.com/arrow-kt/arrow/pull/2748](https://github.com/arrow-kt/arrow/pull/2748)
- [@&#8203;valery1707](https://github.com/valery1707) made their first
contribution in
[https://github.com/arrow-kt/arrow/pull/2824](https://github.com/arrow-kt/arrow/pull/2824)
- [@&#8203;lukasz-kalnik-gcx](https://github.com/lukasz-kalnik-gcx)
made their first contribution in
[https://github.com/arrow-kt/arrow/pull/2822](https://github.com/arrow-kt/arrow/pull/2822)
- [@&#8203;StylianosGakis](https://github.com/StylianosGakis) made
their first contribution in
[https://github.com/arrow-kt/arrow/pull/2832](https://github.com/arrow-kt/arrow/pull/2832)
- [@&#8203;vikrem](https://github.com/vikrem) made their first
contribution in
[https://github.com/arrow-kt/arrow/pull/2836](https://github.com/arrow-kt/arrow/pull/2836)
- [@&#8203;cvb941](https://github.com/cvb941) made their first
contribution in
[https://github.com/arrow-kt/arrow/pull/2840](https://github.com/arrow-kt/arrow/pull/2840)
- [@&#8203;RusticFlare](https://github.com/RusticFlare) made their
first contribution in
[https://github.com/arrow-kt/arrow/pull/2825](https://github.com/arrow-kt/arrow/pull/2825)
- [@&#8203;mjvmroz](https://github.com/mjvmroz) made their first
contribution in
[https://github.com/arrow-kt/arrow/pull/2845](https://github.com/arrow-kt/arrow/pull/2845)
- [@&#8203;MarkMarkyMarkus](https://github.com/MarkMarkyMarkus) made
their first contribution in
[https://github.com/arrow-kt/arrow/pull/2793](https://github.com/arrow-kt/arrow/pull/2793)

**Full Changelog**:
arrow-kt/arrow@1.1.3...1.1.4-rc.3

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/elide-dev/elide).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNi4xMS4wIiwidXBkYXRlZEluVmVyIjoiMzYuMTEuMCIsInRhcmdldEJyYW5jaCI6InYzIn0=-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

9 participants