-
Notifications
You must be signed in to change notification settings - Fork 451
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
Conversation
|
LGTM @nomisRev !, great work! |
Those are great suggestions @sksamuel, |
About |
|
@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 Secondary concern that people might use PS: I assume you'd be okay with a |
@JavierSegoviaCordoba @sksamuel thanks for the great feedback & help shaping Arrow 2.x.x together 🙏 I added |
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:
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? |
Hey @Zordid, Thank you for your feedback. 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 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. |
Without the 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 |
@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)
} |
How about the corresponding functions for |
The idiomatic way is actually using the either {
val sender = ensureNotNull(cElem.findElementString(Tag.Sender)) { MissingDataElementError(Tag.Sender) }
val receiver = ensureNotNull(cElem.findElementString(Tag.Receiver)) { MissingDataElementError(Tag.Receiver }
Transmitter(sender, receiver)
} |
Some relevant PRs: |
[![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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 ([#​3057](https://github.com/arrow-kt/arrow/issues/3057)) by [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​serras](https://github.com/serras) in [https://github.com/arrow-kt/arrow/pull/3094](https://github.com/arrow-kt/arrow/pull/3094) - MemoizedDeepRecursiveFunction by [@​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 [@​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 [@​nomisRev](https://github.com/nomisRev) in [https://github.com/arrow-kt/arrow/pull/3095](https://github.com/arrow-kt/arrow/pull/3095) ##### New Contributors - [@​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) - [@​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) - [@​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) - [@​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) - [@​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) - [@​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) - [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​cvb941](https://github.com/cvb941) in [https://github.com/arrow-kt/arrow/pull/2840](https://github.com/arrow-kt/arrow/pull/2840) - Refactor - [#​2812](https://github.com/arrow-kt/arrow/issues/2812) sequence separate performance by [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​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 [@​nomisRev](https://github.com/nomisRev) in [https://github.com/arrow-kt/arrow/pull/2869](https://github.com/arrow-kt/arrow/pull/2869) #### New Contributors - [@​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) - [@​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) - [@​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) - [@​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) - [@​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) - [@​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) - [@​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) - [@​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) - [@​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=-->
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 beinline 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
fold
, or even simpler byorNull
,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