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

Weaken Either monoid dependencies to only require a semigroup on left #2845

Merged
merged 3 commits into from
Nov 17, 2022

Conversation

mjvmroz
Copy link
Contributor

@mjvmroz mjvmroz commented Nov 1, 2022

Either is a right-biased sum, so no empty is needed on its left side for it to form a Monoid: just a combine. I've weakened the dependency to reflect this. Since Monoid<A> : Semigroup<A>, this is a non-breaking change.

@mjvmroz
Copy link
Contributor Author

mjvmroz commented Nov 1, 2022

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.

Copy link
Member

@raulraja raulraja left a 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.

@nomisRev
Copy link
Member

nomisRev commented Nov 2, 2022

Thank you @mjvmroz, and congrats on your first-contribution! 🥳

@mjvmroz
Copy link
Contributor Author

mjvmroz commented Nov 2, 2022

@raulraja Oh, interesting – I'm making fairly extensive use of both in a project at the moment. WhileSemigroup<A> can certainly be reduced to (A, A) -> A and Monoid<A> to (A, Semigroup<A>), the value of both is in the laws that the names imply, and the associated Kotest-integrated law tests in arrow-core-test. In my case I'm building a commerce system and need to guarantee that bundles of numbers roll up correctly in various structures, so a lot of my stuff has Monoid instances. I'm sure there are similar applications in other correctness-critical spaces where Kotlin/Arrow are commonplace too, like the enterprise SaaS identity domain.

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 arrow-core? If necessary, I'll happily just put together a small package of my own.

@raulraja
Copy link
Member

raulraja commented Nov 2, 2022

@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.
Do you have some example code of your usage where we can judge if it would be better expressed differently with Arrow 2.0, thanks!

@mjvmroz
Copy link
Contributor Author

mjvmroz commented Nov 2, 2022

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 PriceSummary. Those PriceSummarys are then rolled up at an offering level, and then again at a quote level, all via a monoid instance:

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 QuoteBreakdown (e.g. projected revenue, which is not purely a function of price for a given contract), as well as price-related structures in other flows like billing. Explicitly defining and demanding Monoids for our business logic structures is highly appealing because it sends a very clear message about the laws the functions should obey, and makes it super easy to make sure that they do with free law tests.

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 Monoid in my system, I don't necessarily think that Arrow should own it. In any case, it's not much code and has a negligible maintenance cost, so I'm entirely happy to define it myself.

@raulraja
Copy link
Member

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 Monoid as a structure or even having a formal definition of it, whether in Arrow or your project, is helpful whenever you use polymorphism or have generic functions that refer to Typeclass<A> where A is a type argument.

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 empty and combine where needed if the types had instances derived or in scope for those types.

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.

@serras serras merged commit 0bb0973 into arrow-kt:main Nov 17, 2022
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.

5 participants