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

Feature/remove validated #2795

Merged
merged 53 commits into from
Dec 5, 2022
Merged

Conversation

Atternatt
Copy link
Collaborator

  • Removed Validated From the project
  • Had several knit reports (want to discuss and fix)

We removed all the references to Validated in the code but at this point
there are a lot of checks from knit that are not passing due to outdated
checks. They are mainly happening from the code example files.
@Atternatt Atternatt marked this pull request as draft August 9, 2022 14:27
@Atternatt
Copy link
Collaborator Author

Atternatt commented Aug 9, 2022

Hey @nomisRev In this Pr I removed only the Validated and I also removed the example files that contained Validated examples. (also renamed the examples to be consecutive).
At this point I tried to run a grade build and I've got a lot of knit warnings and lately an error:

Execution failed for task ':knitCheck'.
> knitCheck task failed, see log for details (use '--info' for detailed log).
  Run 'knit' task to write 23 missing/outdated files.

I just want to double check how to proceed in this case and how to fix it (as well for the checks that the actions are not passing that looks like a lot of them)

@serras
Copy link
Member

serras commented Aug 9, 2022

@Atternatt The easiest fix is to remove all the Validated examples from Knit and run gradle knit again

@serras
Copy link
Member

serras commented Aug 9, 2022

@Atternatt maybe this is a bit too much asking, but could this be based on #2784? I think we are working on removing many similar things (like computation blocks), and duplicating work would be a waste of resources

@Atternatt
Copy link
Collaborator Author

@Atternatt maybe this is a bit too much asking, but could this be based on #2784? I think we are working on removing many similar things (like computation blocks), and duplicating work would be a waste of resources

I was going to pick that feature but @nomisRev told me that you already picked it so we were discussing what I could do. Then we came to this that consisted of removing Validated from Arrow.
So far, I removed all the references in the project and the example files. Perhaps we could remove a common file with coss dependencies between Validated and Tuple?

@serras
Copy link
Member

serras commented Aug 9, 2022

@Atternatt on a second thought, just go on. My removal touches some parts, but merging should take care of it.

@Atternatt
Copy link
Collaborator Author

on the other hand, would you mind to help me understand what the build errors for the github actions are in order to fix them?

@serras
Copy link
Member

serras commented Aug 9, 2022

Sure thing! The first step would be to run gradle apiDump to update the API files and then commit and push. Since you are removing (lots) of functions the API Compatibility Validator screams at you… but this is the point of starting a new point release, right?

@serras
Copy link
Member

serras commented Aug 9, 2022

To fix the Knit problems, remove all the files in arrow-libs/core/arrow-core/src/jvmTest/kotlin/examples and run gradle knit to recreate the examples. Knit expects to find a file for every example, but since you are removing a few, it can no longer backreference them and fails.

Also removed some Validated references from examples that contained
instances
Removed tests that contained `Validated` references
Removed Validated references from the Readme files (not all of them
as there are some parts that I'm not 100% sure hot to change)
@nomisRev nomisRev added the 2.0.0 Tickets / PRs belonging to Arrow 2.0 label Aug 11, 2022
@Atternatt
Copy link
Collaborator Author

while removing documentation refering to Validated I found something I'm not sure how to fix in arrow-site/docs/docs/patterns/errorhandling/README.md:229.
How should we update this example?

@nomisRev
Copy link
Member

@Atternatt the error handling docs are IMO up for revamping after these changes.

We’ve also changed how to do error handling in Effect, and I hope to change all APIs accordingly. So that would mean this doc would be almost completely outdated. So feel free to remove, or ignore it for now.

@nomisRev nomisRev self-requested a review November 27, 2022 17:41
@nomisRev
Copy link
Member

This PR proposes following changes:

Integrate Validated into Either

Based on some discussion on KotlinLang, and quite some confusion why there is both Validated and Either especially amongst beginners we wanted to explore merging the two. So a small recap between the difference.

Either<E, A> and Validated<E, A> model the same ADT, which is the disjunction between E and A. Either allows you to write happy-path code, and allows sequencing Either<E, A> values that depend on each-other using bind (Monad). Whilst Validated only allows combining values using zip, where you combine both (E, E) -> E and (A, B) -> C. (Applicative). The functionality of Validated can also be exposed over Either, and this PR proposes exactly that.

The reason for doing this is that we want to heavily decrease the API surface, and the resulting learning curve. After the 1.x.x series we realised that combing with the Arrow DSL having both types is not useful, and this is a good opportunity to heavily decrease the API surface. The 1.x.x Either API deprecation PR explains this a little bit as well.

Integrating Validated into Either

In 1.x.x we deprecated Either#zip in favour of either { f(bind(), b.bind(), ...) } which also solves the arity-n issue of zip. This PR replaces the Either#zip behaviour with the accumulating errors powers of Validated, but we can also consider a different name than zip such as fa.validate(fb, ::Tuple2) or fa.accumulate(fb, ::Tuple2). This PR proposes 3 different signatures to work with Either for validation purposes (only arity-2 shown below).

/** The most generic signature */
inline fun <E, A, B, C> Either<E, A>.zip(
  combine: (E, E) -> E,
  other: Either<E, B>,
  transform: (A, B) -> C
): Either<E, C>

/**  Automatically accumulate inside NonEmptyList, without requiring the original `E` to be wrapped */
inline fun <E, A, B, C> Either<E, A>.zip(
  other: Either<E, B>,
  transform: (A, B) -> C
): Either<NonEmptyList<E>, C>

/**
 * A function to combine results of the above function, or validations that would previously return `ValidatedNel`.
 * Regular `Either` values can be lifted into `NonEmptyList<E>` by using `toEitherNel()`.
 */
inline fun <E, A, B, C> Either<NonEmptyList<E>, A>.zip(
  other: Either< NonEmptyList<E>, B>,
  transform: (A, B) -> C
): Either<NonEmptyList<E>, C>

traverse

Besides combining independent values of Validated a second big use-case for using it is traverse which is completely being deprecated for the Arrow DSL, and therefore we also need to find a solution for where you'd previously use traverse + Validated. To replace traverse one can simply use the DSL + Iterable#map, and therefore we thought mapAccumulating offers us an idiomatic name for accumulating typed errors which is what traverse + Validated did.

either<String, List<Int>> {
   listOf(1, 2, 3).map { raise("fail") }
   //listOf(1, 2, 3).map { Either.Left("fail").bind() }
} // Either.Left("fail")

either<String, List<Int>> {
  listOf(1, 2, 3).mapAccumulating(String::plus) { raise("fail") }
  //listOf(1, 2, 3).mapAccumulating(String::plus) { Either.Left("fail").bind() }
} //  Either.Left("failfailfail")

In the same fashion as zip mapAccumulating also provides 2 different methods.

public inline fun <Error, A, B> Iterable<A>.mapAccumulating(
  semigroup: Semigroup<Error>,
  transform: Raise<Error>.(A) -> B,
): Either<Error, List<B>>

public inline fun <Error, A, B> Iterable<A>.mapAccumulating(
  transform: Raise<Error>.(A) -> B,
): Either<NonEmptyList<Error>, List<B>>

It works over Raise<E>, but returns a concrete Either. Snippet below compares traverse to mapAccumulating usages:

fun process(i: Int): Either<String, Int> = i.right()

listOf(1, 2, 3).traverse { process(it) }
listOf(1, 2, 3).mapAccumulating { process(it).bind() }

This API is optimised for context receivers, or working with Raise<E> extension functions. Otherwise it requires the additional call to bind().

Additional changes

Semigroup

To make this PR compile, and these functions to accept (E, E) -> E where fun interface Semigroup is defined the abstract function of Semigroup had to change shape from E.(E) -> E to (E, E) -> E. This is done in a non-binary breaking way, but we can still consider removing Semigroup in a different PR or changing its APIs.

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.

@pakoito
Copy link
Member

pakoito commented Nov 28, 2022

Sounds like an overall positive change! We felt the pain of always reaching for ValidatedNel, but playing with types to the point of defining an EitherNel alias :D

My suggestions are:

  • mapAccumulating -> mapAccumulatingLeft
  • I'd still keep the equivalent of sequence to flatten lists of Either

@nomisRev
Copy link
Member

Hey @pakoito,
Thanks for sharing, great to hear that you've also experienced this and looked for a middle ground in 1.x.x 😁

mapAccumulating -> mapAccumulatingLeft

I felt mapAccumulating was already too long 😂 The name is definitely open for suggestions 🙏 I personally feel mapAccumulatingLeft is a bit long, but mapAccumLeft is perhaps a bit foreign. Should it reflect Raise, or did you choose Left in the name because of the Either return type? Perhaps collectRaise 🤔 collect conflicts a bit with Flow#collect though..

Do you like the new signatures?

I'd still keep the equivalent of sequence to flatten lists of Either

We can definitely do that, but sequence is perhaps not the best name for this 🤔 Any suggestions?

@pakoito
Copy link
Member

pakoito commented Nov 28, 2022

The convention in the stdlib is "XOrY", so this could follow:

For mapping: mapOrAccumulate, mapOrRaiseFirst

For sequencing, "merge" isn't taken: mergeOrRaiseFirst + mergeOrAccumulate.

Do you like the new signatures?

You know I do :D Nested zips will be a bit meh, but I'll probably reach for mergeOrAccumulate + deconstruction instead.

@nomisRev
Copy link
Member

For mapping: mapOrAccumulate, mapOrRaiseFirst

mapOrRaiseFirst do you mean short-circuit behaviour? That is just map.

object Error

fun process(i: Int): Either<Error, Int> = i.right()
fun Raise<Error>.process2(i: Int): Int = i

either<Error, List<Int>> {
  listOf(1, 2, 3).map { process(it).bind() }
  listOf(1, 2, 3).map { process2(it) }
}

I do like mapOrAccumulate! It's more descriptive than mapAccumulate since with mapAccumulate the Accumulate seems to refer to happy-path whilst Or is a Kotlin Std established pattern that it refers to unhappy-path. Thanks @pakoito ❤️

For sequencing, "merge" isn't taken: mergeOrRaiseFirst + mergeOrAccumulate.

I was originally thinking of flatten but didn't propose it since there is no actually flattening (of List or otherwise) happening. Arrow already has Either<A, A>.merge, do you think it would be confusing to use merge here as well?

Nested zips will be a bit meh, but I'll probably reach for mergeOrAccumulate + deconstruction instead.

Do you mean nested zips to achieve arities higher than 9? mergeOrAccumulate + deconstruction is untyped 😭

@nomisRev nomisRev requested review from i-walker, franciscodr, serras and a team November 29, 2022 14:33
@pakoito
Copy link
Member

pakoito commented Nov 29, 2022

Arrow already has Either<A, A>.merge, do you think it would be confusing to use merge here as well?

I'd rename that merge to converge or similar, if that frees the term. It's an extfun over a different type so it'll light up during migration.

import arrow.core.combine
import arrow.core.compose
import kotlin.jvm.JvmName
import kotlin.jvm.JvmStatic

public fun interface Semigroup<A> {

// TODO: think of better name
public fun append(a: A, b: A): A
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is this still part of the Validated removal?
And is append going to replace combine

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I addressed it briefly in my comment, the problem is that the current combine signature doesn't match the signature we want for zip. So these changes belong together. There has been some talk about removing Semigroup, which would remove this changes (and horrible API name). And would replace the Semigroup<E> argument with a simple lambda (E, E) -> E. cc\ @raulraja

Additional changes

Semigroup

To make this PR compile, and these functions to accept (E, E) -> E where fun interface Semigroup is defined the abstract function of Semigroup had to change shape from E.(E) -> E to (E, E) -> E. This is done in a non-binary breaking way, but we can still consider removing Semigroup in a different PR or changing its APIs.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry I missed that :)

Copy link
Member

@i-walker i-walker left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, I would opt to separate the changes in Semigroup in a separate PR.
Is there going to be another PR on writing the stack-safety tests for NonEmptyList, Iterable, etc, or can I pick that up?

@nomisRev
Copy link
Member

I'd rename that merge to converge or similar, if that frees the term. It's an extfun over a different type so it'll light up during migration.

@pakoito I'm hesitant to rename it since it's been quite well established by now. It's a quite popular API afaik, and there will already be so many changes. Also (List<Either<E, A>>) -> Either<E, List<A>> doesn't really merge. When I explain it to someone unfamiliar with the pattern I typically say it flips the container List and Either. But I don't like flip for an API name.

@serras
Copy link
Member

serras commented Dec 5, 2022

@pakoito @nomisRev About the sequence function, I feel like the following expresses the intent quite well.

either { thing.map { it.bind() } } 

I could see that this is a bit complicated to write the first time, though. However, we should remember that the intention is to move people towards the Raise DSL, where you don't need explicit bind at all.

Going into the bind direction, may I suggest instead to have the following function?

fun <E, A> Iterable<Either<E, A>>.bindAll(): List<A> = map { it.bind() }

This would be just a short-hand for "bind everything in this Iterable", in other words, "check that everything in this Iterable is correct". This is slightly more generic than sequence, because we can use it within an either block, but still write either { listOfEithers.bindAll() } if needed.

@serras
Copy link
Member

serras commented Dec 5, 2022

I'm merging this PR so we can continue work in other branches. I've moved the discussion about the "missing function" for iterables of Eithers to #2861.

@serras serras merged commit fbba669 into arrow-kt:arrow-2 Dec 5, 2022
@nomisRev nomisRev mentioned this pull request Dec 10, 2022
20 tasks
nomisRev added a commit that referenced this pull request Apr 24, 2024
* The beginning of Arrow 2.0

* Resource Arrow 2.0 (#2786)

* Flatten Resource ADT, maintain API

* [Arrow 2.0] Effect without suspending shift (#2797)

* Shift without suspend, inline all the rest
* Add new error handlers signatures
* Make ShiftCancellationException private

* Rename Shift to Raise according to Slack Poll, and add some initial docs (#2827)

* Remove all references to shift from new Arrow 2.0 code (#2834)

* Remove all references to shift from new code

* Update API files

* Fixes merge conflict between main and arrow-2 (#2835)

* Add Resource.allocated() to decompose Resource into it's allocate and… (#2820)
* [2743] Migrate internal use of CircuitBreaker double to duration (#2748)
* Fix typo (#2824)
* Make the server disconnect test more general (#2822)
* Update NonEmptyList.fromList deprecation to suggest `toOption()` instead (#2832)
* Improve Either.getOrHandle() docs (#2833)
* Improve allocated, and fix knit examples
Co-authored-by: Jeff Martin <[email protected]>
Co-authored-by: Martin Moore <[email protected]>
Co-authored-by: valery1707 <[email protected]>
Co-authored-by: Lukasz Kalnik <[email protected]>
Co-authored-by: stylianosgakis <[email protected]>

* Add Atomic module, and StateShift (#2817)

* Two small deprecations

* Add Atomic module, and StateShift. Implement ior through StateShift

* Fix build

* Fix atomic knit

* Fix knit attempt #2

* Update API files

* Remove references to shift

* Change return type of raise to Nothing (#2839)

* Change return type of raise to Nothing

Implements #2805

* Update public api with ./gradlew apiDump

* Suppress warnings for unreachable calls to fail in tests

The test is verifying that no code will be executed after a call to
raise, so it's actually testing the very behaviour that the compiler is
warning us about.

Co-authored-by: Alejandro Serrano <[email protected]>

* Update API files

* Increase timeout

* Fix compiler bug with nested inline + while + return

* Clean up ExitCase.fromError

* Update API files@

* Feature/remove validated (#2795)

Co-authored-by: Simon Vergauwen <[email protected]>
Co-authored-by: Alejandro Serrano <[email protected]>

* Remove CancellationExceptionNoTrace.kt after merge, and run apiDump

* Add missing runnerJUnit5 for arrow-atomic JVM

* Publish Arrow 2.0.0-SNAPSHOT (#2871)

Co-authored-by: Javier Segovia Córdoba <[email protected]>

* Simplify optics to Traversal/Optional/Lens/Prism (#2873)

* 'mapOrAccumulate' for Raise (#2872)

Co-authored-by: Simon Vergauwen <[email protected]>

* Fix problems with Atomic

* Smaller timeouts

* Remove Tuple10 to Tuple22, Const, Eval, computation blocks, and arrow-continuations (#2784)

* Revert typo

* Fix build

* Fix ParMapJvmTest

* Implement NonEmptyList using value class (#2911)

* Fix merge w.r.t. Saga

* apiDump

* Test other return expression

* change unalign signature (#2972)

see discussion in
#2960 (comment)
#2960 (comment)

---------

Co-authored-by: Alejandro Serrano <[email protected]>

* Update after merge main

* Fix :arrow-optics-ksp-plugin:compileKotlin

* Fix Every instances

* Move functions to arrow functions (#3014)

* Bring back `Iso` (#3013)

* Bring back Iso

* API Dump

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Update BOM (#3019)

* Fix andThen duplication (#3020)

* Fix Knit

* Fix weird problem with value classes

* Update API docs

* Update publish workflow

Following the instructions in #3090 (comment)

* No closing repo on snapshot

* knit

* Fix optics tests

* Fix after merge

* Refactor ParMapTest from Kotest Plugin to Kotlin-test runtime #3191 (#3221)

Co-authored-by: Simon Vergauwen <[email protected]>
Co-authored-by: Alejandro Serrano <[email protected]>

* Refactor: Use Kotlin-test runtime for arrow-fx-stm tests (#3224)

Co-authored-by: Alejandro Serrano <[email protected]>

* Update all Gradle files to mention kotlin.test

* Refactor ParZip2Test from Kotest Plugin to Kotlin-test runtime #3192 (#3222)

Co-authored-by: Alejandro Serrano <[email protected]>

* Refactor ParZip3Test from Kotest Plugin to Kotlin-test runtime #3193 (#3223)

Co-authored-by: Alejandro Serrano <[email protected]>

* Refactor GuaranteeCaseTest to use kotlin test (#3226)

Closes #3190

* refactor: migrate NotEmptySetTest to kotlin-test (#3230)

Co-authored-by: Alejandro Serrano <[email protected]>

* refactor: migrate EagerEffectSpec to kotlin-test (#3233)

Co-authored-by: Alejandro Serrano <[email protected]>

* Refactor NullableSpec from Kotest Plugin to Kotlin-test runtime (#3236)

#3153

Co-authored-by: Alejandro Serrano <[email protected]>

* Refactor BracketCaseTest to use kotlin test (#3237)

Closes #3186

Co-authored-by: Alejandro Serrano <[email protected]>

* Move arrow-functions tests to kotlin.test (#3243)

* Inline `AtomicBoolean` (#3240)

* Inline AtomicBoolean

* Update API files

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* refactor: migrate MappersSpec to kotlin-test (#3248)

* Refactor ResourceTestJvm from Kotest Plugin to Kotlin-test runtime (#3244)

Closes #3213

* refactor: migrate FlowJvmTest to Kotlin-test (#3228)

* Refactor ParZip9JvmTest from Kotest Plugin to Kotlin-test runtime (#3245)

Closes #3211

* Refactor ParZip8JvmTest from Kotest Plugin to Kotlin-test runtime (#3246)

Closes #3210

* refactor: migrate NumberInstancesTest to kotlin-test (#3232)

* refactor: OptionTest to kotlin-test runtime (#3229)

* Revert "Inline `AtomicBoolean` (#3240)" (#3279)

This reverts commit a6f1e73.

* Refactor ParZip6JvmTest from Kotest Plugin to Kotlin-test runtime (#3255)

Closes #3208

* Refactor ParZip5JvmTest from Kotest Plugin to Kotlin-test runtime (#3256)

Closes #3207

* Refactor ParZip3JvmTest from Kotest Plugin to Kotlin-test runtime (#3258)

Closes #3205

* Refactor ParZip2JvmTest from Kotest Plugin to Kotlin-test runtime (#3259)

Closes #3204

* Refactor ParMapJvmTest from Kotest Plugin to Kotlin-test runtime (#3260)

Closes #3203

* Refactor ParZip4JvmTest from Kotest Plugin to Kotlin-test runtime (#3257)

Closes #3206

* refactor: migrate RaiseAccumulateSpec to kotlin-test (#3250)

* Refactor ParZip7JvmTest from Kotest Plugin to Kotlin-test runtime (#3247)

Closes #3209

Co-authored-by: Alejandro Serrano <[email protected]>

* Update ComparisonKtTest.kt (#3274)

Co-authored-by: Simon Vergauwen <[email protected]>

* Update OptionSpec.kt (#3271)

Co-authored-by: Simon Vergauwen <[email protected]>

* Update TraceJvmSpec.kt (#3276)

* Update TraceJvmSpec.kt

* Update TraceJvmSpec.kt

---------

Co-authored-by: Simon Vergauwen <[email protected]>

* Update ParZip9Test.kt (#3265)

* Update ParZip9Test.kt

* Update ParZip9Test.kt

* Update ParZip8Test.kt (#3266)

* Update ParZip7Test.kt (#3267)

* Update ParZip6Test.kt (#3268)

* Update ParZip5Test.kt (#3269)

* Update ParZip4Test.kt (#3270)

* Refactor CountDownLatchSpec and CyclicBarrierSpec to use kotlin test (#3227)

* Refactor CountDownLatchSpec to use kotlin test

Closes #3187

* Refactor CyclicBarrierSpec to use kotlin test

Closes #3188

---------

Co-authored-by: Alejandro Serrano <[email protected]>

* Refactor NonEmptyListTest to kotlin-test (#3231)

* Add kotlin test dependency

* Refactor NonEmptyList Test to use kotlin test

---------

Co-authored-by: Alejandro Serrano <[email protected]>

* refactor: migrate EffectSpec to kotlin-test (#3234)

* Refactor FlowTest to use kotlin test (#3238)

Closes #3189

Co-authored-by: Alejandro Serrano <[email protected]>

* refactor: migrate IorSpec to kotlin-test (#3249)

Co-authored-by: Simon Vergauwen <[email protected]>

* refactor: migrate ResultSpec to kotlin-test (#3251)

Co-authored-by: Simon Vergauwen <[email protected]>

* refactor: migrate StructuredConcurrencySpec to kotlin-test (#3252)

* refactor: migrate TraceSpec to kotlin-test (#3253)

* refactor: migrate GeneratorsTest to kotlin-test (#3254)

* Refactor RaceNJvmTest from Kotest Plugin to Kotlin-test runtime (#3261)

Closes #3212

Co-authored-by: Alejandro Serrano <[email protected]>

* Update ArrowResponseEAdapterTest.kt (#3264)

* Update ArrowResponseEAdapterTest.kt

* Update ArrowResponseEAdapterTest.kt

---------

Co-authored-by: Simon Vergauwen <[email protected]>
Co-authored-by: Alejandro Serrano <[email protected]>

* Update CollectionsSyntaxTests.kt (#3273)

* Update CollectionsSyntaxTests.kt

* Update CollectionsSyntaxTests.kt

---------

Co-authored-by: Simon Vergauwen <[email protected]>
Co-authored-by: Alejandro Serrano <[email protected]>

* Update NonFatalJvmTest.kt (#3277)

* Update ArrowEitherCallAdapterTest.kt (#3278)

* Update ArrowEitherCallAdapterTest.kt

* Update ArrowEitherCallAdapterTest.kt

* Move tests from `serialization` and `functions` completely to `kotlin.test` (#3289)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Fix problems with tests

* Remove a bunch of warnings in `arrow-2` (#3282)

Co-authored-by: serras <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Finish transition to `kotlin.test` of `retrofit` and `fx-coroutines` (#3291)

* Fix problems with concurrency in tests, take 8

* Port rest of `arrow-core` to `kotlin.test` (#3292)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Implement `fixedRate` using monotonic time source (#3294)

Co-authored-by: serras <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Port `optics` tests to `kotlin.test` (#3295)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Add or fix contracts in Raise (#3293)

* Add or fix contracts in Raise

* Make contracts less strict

* Get back contract on Either

* ignoreErrors should also be AT_MOST_ONCE

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Alternate `SingletonRaise` (#3328)

Co-authored-by: Youssef Shoaib <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: serras <[email protected]>

* Remove (unused) tests for high-arity module

* Fix tests + Knit

* Fix merge NullableSpec

* Regression in Arb.list?

* Fix test for nonEmptyList

* Develocity warning

* Fix merge problem with optics-ksp-plugin

* Fix timeout in test

---------

Co-authored-by: Simon Vergauwen <[email protected]>
Co-authored-by: Sam Cooper <[email protected]>
Co-authored-by: Marc Moreno Ferrer <[email protected]>
Co-authored-by: Javier Segovia Córdoba <[email protected]>
Co-authored-by: Alphonse Bendt <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Andreas Storesund Madsen <[email protected]>
Co-authored-by: molikuner <[email protected]>
Co-authored-by: Jonathan Lagneaux <[email protected]>
Co-authored-by: Marcus Ilgner <[email protected]>
Co-authored-by: Chris Black <[email protected]>
Co-authored-by: Tejas Mate <[email protected]>
Co-authored-by: HyunWoo Lee (Nunu Lee) <[email protected]>
Co-authored-by: serras <[email protected]>
Co-authored-by: Youssef Shoaib <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
2.0.0 Tickets / PRs belonging to Arrow 2.0
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants