Monix v3.0.0 Release Notes

Release Date: 2019-06-16 // 3 months ago
  • πŸ”– Version 3.0.0-RC3 (June 16, 2019)

    πŸš€ This release depends on Cats-Effect 1.3.1 and Cats 1.6.1.

    πŸš€ The next planned release will target Cats-Effect 2.0.0 with Scala 2.13 support.

    πŸš€ NOTE: this release IS NOT binary compatible with 3.0.0-RC2, as it contains some API changes, but it should be source compatible (with @deprecated symbols where the case).

    Sub-project: monix-execution

    This sub-project no longer depends on cats-effect and there are various
    πŸ‘Œ improvement to Local aimed at fixing interop with Future. Note that
    you might have to call Local.isolate to disable any sharing between tasks.

    PR #775:
    Simplified FutureUtils materialize & dematerialize

    PR #790:
    πŸ‘Œ improve fixed rate scheduling on JS

    PR #803:
    Eagerly null out dequeued elements in ChunkedArrayQueue

    PR #822:
    βœ‚ remove dependency on cats-effect from monix-execution

    PR #773:
    πŸ”„ change Cancelable.empty type to Cancelable

    PR #887:
    Shared locals with binds

    PR #888:
    πŸ›  Fix uncaught exception reporting for Scheduler

    Sub-project: monix-catnap

    PR #778:
    βž• Adds ConcurrentChannel

    PR #784:
    βœ… More concurrent tests for MVar/Semaphore

    PR #865:
    βž• Adding FunctionK values for Task, Coeval

    Sub-project: monix-eval

    PR #802:
    encapsulate local ctx on task execution

    PR #807:
    πŸ‘Œ Improve encapsulation test, encapsulate locals on ContextShift

    PR #838:
    βž• Add taskified variants of timeout combinators

    PR #839:
    TaskLocal should propagate when used with Bracket Methods

    PR #849:
    πŸ‘» Specify exception on timeout

    PR #887:
    Shared locals with binds

    PR #865:
    βž• Adding FunctionK values for Task, Coeval

    Sub-project: monix-reactive

    PR #759:
    βž• Add Contravariant Observer and Subscriber

    PR #760:
    βž• add Observable.filterEval

    PR #774:
    βž• Add FunctorFilter instances for Iterant&Observable

    PR #779:
    fork blocking i/o observable ops

    PR #794:
    πŸ”’ Acquire lock per subscription instead of observable-wide lock

    PR #801:
    ♻️ Observable buffers refactoring

    PR #819:
    Extend ObservableLike with filterNot method

    PR #831:
    βœ… SerializableSuite to no longer test Future for serializability

    PR #834:
    Observable.reduce should emit for single item source

    PR #846:
    Ensure mapParallelOrdered runs in parallel

    PR #872:
    βž• Add observable take while inclusive

    PR #895:
    πŸ›  Fix memory leak in MapParallelOrderedObservable

    Sub-project: monix-tail

    PR #778:
    βž• Adds Iterant.channel, Iterant#consume

    PR #826:
    βž• add Iterant.uncons operation

    Chores

    PR #766:
    ⚑️ Update sbt-unidoc to 0.4.2

    PR #766:
    ⚑️ Update sbt-pgp to 1.1.2

    PR #768:
    ⚑️ Update sbt-mima-plugin to 0.3.0

    PR #769:
    ⚑️ Update sbt-git to 1.0.0

    PR #770:
    ⚑️ Update jctools-core to 2.1.2

    PR #771:
    ⚑️ Update kind-projector to 0.9.8

    PR #772:
    ⚑️ Update sbt-jmh to 0.3.4

    PR #771:
    ⚑️ Update kind-projector to 0.9.9

    PR #783:
    πŸ‘‰ Use globally accessible (rather than local) source paths in JS source maps (#781)

    PR #785:
    ⚑️ Update sbt-scalajs, scalajs-compiler, scalajs-library... to 0.6.26

    PR #788:
    ⚑️ Update cats-effect, cats-effect-laws to 1.1.0

    PR #796:
    πŸ›  fix scalacOptions

    PR #797:
    Scala 2.12.8

    PR #798:
    ⚑️ Update intervalWithFixedDelay scaladoc

    PR #805:
    πŸ“‡ Rename keysBuffer to os in groupBy's parameters

    PR #808:
    ⚑️ Update Copyright to 2019

    PR #810:
    sbt 1.2.8 (was 1.1.0)

    PR #812:
    ⚑️ Update Minitest to 2.3.2

    PR #813:
    Disable code coverage

    PR #818:
    ⚑️ Update Cats-Effect to 1.2.0

    PR #820:
    ⚑️ Update cats-laws to 1.5.0

    PR #821:
    ⚑️ Update cats-laws to 1.6.0

    PR #823:
    πŸ‘ Scala 2.13 support

    PR #821:
    ⚑️ Update sbt-header to 5.1.0

    PR #827:
    βœ‚ Remove comments from .jvmopts

    PR #833:
    πŸ›  Fix build for 2.13.0-M5 by deactivating Mima for it

    PR #840:
    βž• Add adopters list seed

    PR #842:
    πŸ›  Fixed deprecation docs for Task#coeval

    PR #843:
    βœ‚ Remove dead code from tests

    PR #844:
    ⚑️ Update sbt-header to 5.2.0

    PR #847:
    ⚑️ Update ExecutionModel.scala

    PR #850:
    ⏱ Increase rate in AsyncSchedulerSuite

    PR #854:
    πŸ›  fix apparently erronous code involving Unit companion

    PR #855:
    ⚑️ Update sbt-jmh to 0.3.5

    PR #857:
    πŸ‘‰ Make benchmarks compile

    PR #859:
    ⚑️ Update sbt-scalajs, scalajs-compiler to 0.6.27

    PR #867:
    ⚑️ Update kind-projector to 0.10.0

    PR #869:
    πŸ›  fix compile errors with latest Scala 2.13

    PR #874:
    ⚑️ Update cats-effect, cats-effect-laws to 1.3.0

    PR #878:
    Compile Benchmarks in CI

    PR #879:
    Do on subscription cancel scaladoc fix

    PR #889:
    ⚑️ Update cats-effect, cats-effect-laws to 1.3.1

    PR #894:
    βž• Add UnsafeBecauseImpure Annotation to foreach.

    PR #896:
    ⚑️ Update cats-laws to 1.6.1

    PR #898:
    Reformating via Scalafmt

    PR #899:
    πŸ›  Fix autoCancelableRunLoops comment.

    PR #901:
    πŸ—„ avoid deprecated unicode arrow chars

    PR #902:
    πŸ— reformat build files

    Thanks

    πŸš€ People that made this release possible, in alphabetical order:

    πŸš€ And special thanks to our top contributor in this release:
    https://github.com/fthomas/scala-steward :)


Previous changes from v3.0.0-RC2

  • ⚑️ Cats-Effect Updates

    πŸ‘Œ Supporting Cats-Effect 1.0.0 has been a massive amount of work:

    • PR #659 Cats Effect 1.0.0-RC update
    • PR #681: Cats-Effect 1.0.0-RC2 update
    • PR #686: Cats-Effect 1.0.0-RC3 update, Task conversions
    • PR #716: Updates to Cats-Effect 1.0.0

    Also related, but mentioned below:

    • Iterant's encoding had to change due to the new contract of Cats-Effect's type classes, in a massive change of internals that also improved its performance and safety (#683)

    Sub-project: monix-execution

    ♻️ Several features, deprecations and refactorings happened in monix-execution, mentioned under the changes for monix-catnap below:

    • ♻️ monix.execution.misc.AsyncVar was refactored, to have an interface in line with the MVar in Cats-Effect and moved to monix.execution.AsyncVar (#753)
    • ♻️ monix.execution.misc.AsyncSemaphore was also refactored and enhanced, with an interface resembling that of Cats-Effect's Semaphore and moved to monix.execution.Semaphore (#754)
    • monix.execution.AsyncQueue was added (#757)
    • monix.execution.Callback was added (#740)
    • monix.execution.FutureUtils and CancelableFuture can now take care of the conversions of Scala's Future to and from Java's CompletableFuture (#761)

    Other features:

    • PR #675: Switches to stdlib NonFatal
    • PR #738: Adds CancelablePromise
    • PR #765: Changes TrampolineScheduler's internal stack back to a queue

    Sub-project: monix-catnap

    This is a new project introduced that currently depends on only monix-execution and Cats/Cats-Effect and whose purpose is to provide abstractions built on top of Cats-Effect's type classes.

    • PR #744: Adds monix.catnap.CircuitBreaker and LiftFuture
    • PR #753: Adds generic monix.catnap.MVar and monix.execution.AsyncVar refactoring
    • PR #756: Makes MVar fork on async take for fairness
    • PR #754: Adds generic monix.catnap.Semaphore and monix.execution.AsyncSemaphore refactoring
    • PR #757: Adds monix.execution.AsyncQueue and monix.catnap.ConcurrentQueue
    • PR #762: Fixes issue typelevel/cats-effect#403, also added monix.catnap.cancelables.SingleAssignCancelableF

    Also mentioned below, as part of other features:

    • βž• Added monix.catnap.CancelableF and monix.catnap.cancelables.BooleanCancelableF (#726)

    Note: the new FutureLift type class provides some of the πŸ—„ functionality of the now deprecated monix-java8.

    Sub-project: monix-eval

    πŸ—„ Major removals (with deprecation symbols kept around):

    • monix.eval.TaskSemaphore, replaced by the generic monix.catnap.Semaphore
    • monix.eval.MVar, replaced by the generic monix.catnap.MVar
    • monix.eval.TaskCircuitBreaker, replaced by the generic monix.catnap.CircuitBreaker

    This was done because having these implementations specialized for πŸ‘ Task doesn't make sense and the new implementations are better and have more features.

    πŸ”‹ Features:

    • PR #626: Adds forever for Task
    • PR #636: Adds join to the fork documentation
    • PR #639: Makes Coeval.value empty-parens to indicate side effects
    • PR #638: Fixes Task.foreach waiting / error reporting
    • PR #634: Adds ability to specify custom options on Effect[Task]
    • PR #655: Handles InterruptedException in NonFatal
    • PR #660: Makes TaskApp scheduler and options defs
    • PR #664: Fixes Task.map2 not executing things in sequence
    • PR #661: Makes mapBoth always execute tasks in parallel
    • PR #669 Adds uncancelable to example
    • PR #647: Changes internal encoding for Task.Async (major!)
    • PR #670: Task gets smarter about forking and async boundaries
    • PR #652: Uses TaskLocal#local in TaskLocal#bindL and TaskLocal#bindClear
    • PR #679: Fixes Task.bracket, onCancelRaiseError; introduce Task.ContextSwitch
    • PR #706: Adds SemigroupK[Task] instance
    • PR #715: Implements Task timed method
    • PR #724: Makes Task auto-cancelable by defaul (major!)
    • PR #725: Adds runtime check to TaskLocal to make it safer
    • PR #726: Changes Task to sequence (back-pressure) async finalizers (major!)
    • PR #732: Adds guarantee and guaranteeCase methods on Task and Coeval
    • PR #740: Moves Callback to monix.execution, Task runAsync refactor, rename to runToFuture (major!)
    • PR #761: Expands FutureLift to take care of CompletableFuture

    Sub-project: monix-reactive

    ♻️ Observable suffered an API refactoring, changing the convention for operators that take Task or F[_] : Effect values as arguments:

    • operators using Task now use the Eval suffix instead of Task, or no special suffix at all
    • πŸ”€ operators using F[_] : Sync parameters use an F suffix
    • 🚦 the F suffixed operators previously signalled operators that kept the Observable context (e.g. findF), however all of them have been renamed

    πŸ‘€ See PR #729 for details.

    πŸ”‹ Features:

    • PR #610: Adds scan0, flatScan0, flatScan0DelayErrors, scanEval0, scanMap0 on Observable
    • PR #641: Reference bufferTumbling instead of buffer in scaladoc
    • PR #646: Fixes ack.future called when Ack is null
    • PR #657: Adds a few missing tests to Observable methods
    • PR #684: Simplifies logic in TakeLastOperator.onNext
    • PR #704: Introduces Observable.doOnStartTask and Observable.doOnStartEval
    • PR #723: Adds Alternative instance for Observable
    • PR #654: Makes Observable#++'s argument lazy
    • PR #729: Adds Observable.bracket, Iterant/Task API refactorings, fixes (major!)
    • PR #741: Adds cats Profunctor instance for Subject
    • PR #739: Adds operator bufferTimedWithPressure with sizeOf on Observable
    • PR #743: Improvs Observable.collect to avoid double evaluation
    • PR #749: Adds Profunctor and Contravariant instance for Consumer
    • PR #750: Fixes handling start/end of Long range in RangeObservable
    • PR #558: Adds Observable.mapParallelOrdered

    Sub-project: monix-tail

    The Iterant encoding suffered a major change, with all operators described for Iterant being changed for it. This was done because:

    πŸ‘ 1. the old encoding couldn't be supported under the auto-cancelable model promoted by Cats-Effect 1.0.0 🐎 2. the new encoding is safer and has better performance too

    πŸ”‹ Features:

    • PR #683: Iterant, version 2 (major)
    • PR #614: Adds scan0, scanEval0, scanMap0 on Iterant
    • PR #622: Adds mapBatch for Iterant
    • PR #629: Fixes IterantBuildersSync methods to not require implicit F: Sync[F]
    • PR #631: Renames toGenerator to toBatch in Cursor
    • PR #633: Fixes eagerness of .bracket on Last nodes
    • PR #621: Changes behavior of Batch#fromArray, fromAnyArray
    • PR #656: Makes Iterant's ++ take a lazy (by-name) parameter
    • PR #662: Adds Iterant.fromReactivePublisher
    • PR #709: Removes unused function from EvalOnNextAck
    • PR #707: Add Iterant.lastOptionL
    • PR #746: Fix Iterant.fromReactivePublisher
    • PR #755: Remove the Sync[Iterant] instance

    πŸ—„ Sub-project deprecation: monix-java8

    The functionality in monix-java8 was implemented directly in:

    1. monix.execution.FutureUtils
    2. monix.execution.CancelableFuture
    3. monix.catnap.FutureLift

    πŸ—„ The monix-java8 sub-project is still provided, but is deprecated and 🚚 will soon be removed.

    Chores

    • PR #653: Update Monix's rootdoc, the landing page for the ScalaDoc
    • PR #671: Optionally allow forcing a build on Java 9+
    • PR #677: Add Starting Point section to CONTRIBUTING.md
    • PR #693: Fix micro doc typo in monix.execution.misc.InlineMacros
    • PR #699: Add Concat and Scope to Iterant's description
    • PR #640: Add sbt-doctest, to verify code examples in ScalaDoc
    • PR #705: Fix all ScalaDocs (except Task's) in monix.eval
    • PR #717: Change to Scala's Code of Conduct
    • PR #720: Add @Avasil to the Code of Conduct
    • PR #718: Fix Task ScalaDocs
    • PR #736: Update doctest plugin version
    • PR #763: Fix Observable doc mentioning cats.Eq

    Thanks

    πŸš€ People that made this release possible, in alphabetical order:

    • Alexandru Nedelcu (@alexandru)
    • Eduardo Barrientos (@kdoomsday)
    • Eugene Platonov (@jozic)
    • Jakub KozΕ‚owski (@kubukoz)
    • Jamie Wilson (@jfwilson)
    • Joe Ferris (@jferris)
    • Jules Ivanic (@guizmaii)
    • Kacper Gunia (@cakper)
    • Kamil Kloch (@kamilkloch)
    • LorΓ‘nd SzakΓ‘cs (@lorandszakacs)
    • Oleg Pyzhcov (@oleg-py)
    • Piotr GawryΕ› (@Avasil)
    • Raas A (@RaasAhsan)
    • Seth Tisue (@SethTisue)
    • Yohann B (@ybr)
    • jendakol (@jendakol)
    • volth (@volth)