-
Notifications
You must be signed in to change notification settings - Fork 448
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
Weaken Either monoid dependencies to only require a semigroup on left #2845
Conversation
b629907
to
daa8676
Compare
Oop sorry, I'm not used to Github's model. That force push was just to try to force a build on my end after enabling actions for my fork. I see now that the build has to run here, and that that has to be approved; makes sense. |
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.
Thanks, @mjvmroz.
looks great and can probably make it to the next release but be aware we are planning a deprecation of Monoid and other Typeclasses that currently provide no added value.
In this case, for example, Semigroup can be just expressed as (A, A) -> A
. All methods where we need a semigroup or monoid can be implemented without them by passing just the function or neutral element A
where needed.
Thank you @mjvmroz, and congrats on your first-contribution! 🥳 |
@raulraja Oh, interesting – I'm making fairly extensive use of both in a project at the moment. While I've followed the progression of Arrow for quite a while now. I thought the decision to move away from emulated HKTs was a good one, and I 100% get it if these typeclass encodings and tests don't really feel too relevant to the project anymore, but I think they're useful enough to earn themselves and their tests a home somewhere. I'm certainly not going to argue that that's a good enough reason for any of this to continue living here; just looking to understand the intention and a rough timeline for this change. Are you planning to nuke this all entirely, or just move it out of |
@mjvmroz we have not decided the actual outcome of the refactoring over those yet but generally speaking, most places where they were in use in Arrow are gone because of changes to the methods that depended on them. |
Sure, here's one example from a sales/quoting system. Quotes contain parameterised "offering" instances, with each offering comprising a collection of parameterised items/products. Each item needs to have a billing schedule calculated, have a total price rolled up from that, and register the currency value of each applied discount. In this specific case, all of that forms a data class PriceSummary(
// `Price` itself is a composite structure with its own monoid instance
val price: Price,
val billingSchedule: Map<LocalDate, Price>,
val discountValues: Map<DiscountId, BigDecimal>,
) {
companion object : Monoid<PriceSummary> {
override fun empty() = PriceSummary(Price.empty(), emptyMap(), emptyMap())
private val scheduleMonoid = Monoid.map<LocalDate, Price>(Price)
private val discountValuesMonoid = Monoid.map<DiscountId, BigDecimal>(Monoid.bigDecimalSum)
override fun PriceSummary.combine(b: PriceSummary) = PriceSummary(
price = price.combine(b.price),
billingSchedule = scheduleMonoid.run { billingSchedule.combine(b.billingSchedule) },
discountValues = discountValuesMonoid.run { discountValues.combine(b.discountValues) },
)
}
}
abstract class QuoteCalculator {
// `PricingContext` holds onto a bunch of data that currently has to be pulled
// from quotes by foreign reference, allowing us to isolate effects for testing.
protected abstract fun buildPricingContext(quote: Quote): PricingContext
private fun PricingContext.itemPrice(item: QuoteItem, period: DateSpan): PriceSummary = /* ... */
// `QuoteBreakdown` mirrors `Quote`'s structure, but contains
// arbitrary data associated with offering/item identifiers.
fun priceQuote(quote: Quote): QuoteBreakdown<PriceSummary> = buildPricingContext(quote).run {
// `foldOnItems` second parameter is demanding a monoid instance for `QuoteBreakdown<*>`'s type param
QuoteBreakdown.foldOnItems(quote, PriceSummary) { item, offering -> itemPrice(item, offering.dateSpan) }
}
} We have similar needs when running other calculations with respect to quotes also using I didn't realise that Arrow's remaining typeclass stuff was more or less a relic and on the way out, but given the project's progression, it's not too surprising. And I do suspect that an extreme minority of Arrow consumers are using this stuff. So I will stress that while I value a formal encoding of |
thanks @mjvmroz for the example and sorry for the late reply, I've been swamped with work in the last few weeks and I just saw this. I tried encoding your example to see what it would look like without type classes. public data class LocalDate(val value: Long)
public data class DiscountId(val value: Long)
public object PricingContext
public data class Price(val value: Double) {
/**
* Semigroup combine
*/
public operator fun plus(other: Price): Price =
Price(value + other.value)
public companion object {
/**
* Monoid empty
*/
public val empty: Price = Price(0.0)
}
}
public data class PriceSummary(
val price: Price,
val billingSchedule: Map<LocalDate, Price>,
val discountValues: Map<DiscountId, Double>,
) {
public operator fun plus(other: PriceSummary): PriceSummary =
PriceSummary(
price = price + other.price,
billingSchedule = billingSchedule + other.billingSchedule,
discountValues = discountValues + other.discountValues
)
public companion object {
public val empty: PriceSummary = PriceSummary(Price.empty, emptyMap(), emptyMap())
}
}
I think keeping In your example, since all the types are concrete and the code referring to them is also concrete, it's more accessible to add ad-hoc operators over the types, which are easier to call and deal with than passing type class instance value arguments that satisfy type class injection requirements. If Kotlin had implicits and type class injection, it would be different since you could magically use We are inclined to remove these type classes because, in most use cases, they are applied over concrete models and not used in polymorphism, resulting in more complicated code. This is different in Scala cats and others where there is considerable generic infra relying on these and taking advantage that they magically get injected by implicits and auto derived in some cases by the scala compiler, I think there it makes sense. I think in Kotlin, type classes get in the way due to a lack of implicit support, and the language is going in a different direction with context receivers. |
[![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=-->
Either
is a right-biased sum, so noempty
is needed on its left side for it to form aMonoid
: just acombine
. I've weakened the dependency to reflect this. SinceMonoid<A> : Semigroup<A>
, this is a non-breaking change.