From b54cefc057f37df1e7ee15c55d4a7e33cb1f9eaf Mon Sep 17 00:00:00 2001 From: Adam Hearn <22334119+hearnadam@users.noreply.github.com> Date: Thu, 17 Apr 2025 10:19:04 +0900 Subject: [PATCH 1/5] Mark traits+abstract classes as sealed --- benchmarks/src/main/scala/zio/BenchmarkUtil.scala | 4 ++-- core/js/src/main/scala/zio/ClockPlatformSpecific.scala | 2 +- core/js/src/main/scala/zio/Scheduler.scala | 4 +++- .../src/main/scala/zio/ClockPlatformSpecific.scala | 2 +- core/jvm-native/src/main/scala/zio/Scheduler.scala | 4 +++- core/shared/src/main/scala/zio/Cached.scala | 2 +- core/shared/src/main/scala/zio/Dequeue.scala | 5 ++++- core/shared/src/main/scala/zio/Enqueue.scala | 5 ++++- core/shared/src/main/scala/zio/FiberRef.scala | 2 +- core/shared/src/main/scala/zio/Hub.scala | 4 ++-- core/shared/src/main/scala/zio/Queue.scala | 3 ++- core/shared/src/main/scala/zio/Ref.scala | 3 ++- core/shared/src/main/scala/zio/Runtime.scala | 3 ++- core/shared/src/main/scala/zio/Scope.scala | 2 +- core/shared/src/main/scala/zio/ScopedRef.scala | 2 +- core/shared/src/main/scala/zio/ThreadLocalBridge.scala | 2 +- core/shared/src/main/scala/zio/ZIO.scala | 4 ++-- core/shared/src/main/scala/zio/ZInputStream.scala | 2 +- core/shared/src/main/scala/zio/ZKeyedPool.scala | 2 +- core/shared/src/main/scala/zio/ZLayer.scala | 4 ++-- core/shared/src/main/scala/zio/ZOutputStream.scala | 2 +- core/shared/src/main/scala/zio/package.scala | 2 +- core/shared/src/main/scala/zio/stm/TDequeue.scala | 5 ++++- core/shared/src/main/scala/zio/stm/TEnqueue.scala | 5 ++++- core/shared/src/main/scala/zio/stm/THub.scala | 4 ++-- core/shared/src/main/scala/zio/stm/TQueue.scala | 2 +- managed/shared/src/main/scala/zio/managed/ZManaged.scala | 4 ++-- .../shared/src/test/scala/zio/stream/ZSinkSpec.scala | 2 +- .../shared/src/main/scala/zio/stream/SubscriptionRef.scala | 2 +- streams/shared/src/main/scala/zio/stream/ZStream.scala | 2 +- .../src/main/scala/zio/test/TestClockPlatformSpecific.scala | 2 +- .../src/main/scala/zio/test/TestClockPlatformSpecific.scala | 2 +- 32 files changed, 57 insertions(+), 38 deletions(-) diff --git a/benchmarks/src/main/scala/zio/BenchmarkUtil.scala b/benchmarks/src/main/scala/zio/BenchmarkUtil.scala index fb5d72171165..14ea69ff8d62 100644 --- a/benchmarks/src/main/scala/zio/BenchmarkUtil.scala +++ b/benchmarks/src/main/scala/zio/BenchmarkUtil.scala @@ -5,7 +5,7 @@ import cats.effect.{Fiber => CFiber, IO => CIO} import scala.concurrent.ExecutionContext -object BenchmarkUtil extends Runtime[Any] { self => +object BenchmarkUtil extends Runtime.Internal[Any] { self => val environment = Runtime.default.environment val fiberRefs = Runtime.default.fiberRefs @@ -39,7 +39,7 @@ object BenchmarkUtil extends Runtime[Any] { self => Unsafe.unsafe(implicit unsafe => rt.unsafe.run(zio).getOrThrowFiberFailure()) } - private object NoFiberRootsRuntime extends Runtime[Any] { + private object NoFiberRootsRuntime extends Runtime.Internal[Any] { val environment = Runtime.default.environment val fiberRefs = Runtime.default.fiberRefs val runtimeFlags = RuntimeFlags(RuntimeFlag.CooperativeYielding, RuntimeFlag.Interruption) diff --git a/core/js/src/main/scala/zio/ClockPlatformSpecific.scala b/core/js/src/main/scala/zio/ClockPlatformSpecific.scala index 66a696e768a8..4adf7afc10e8 100644 --- a/core/js/src/main/scala/zio/ClockPlatformSpecific.scala +++ b/core/js/src/main/scala/zio/ClockPlatformSpecific.scala @@ -21,7 +21,7 @@ import zio.stacktracer.TracingImplicits.disableAutoTrace import scala.scalajs.js private[zio] trait ClockPlatformSpecific { - private[zio] val globalScheduler = new Scheduler { + private[zio] val globalScheduler = new Scheduler.Internal { import Scheduler.CancelToken private[this] val ConstFalse = () => false diff --git a/core/js/src/main/scala/zio/Scheduler.scala b/core/js/src/main/scala/zio/Scheduler.scala index d49b959255ed..d61ee3c18f25 100644 --- a/core/js/src/main/scala/zio/Scheduler.scala +++ b/core/js/src/main/scala/zio/Scheduler.scala @@ -21,13 +21,15 @@ import zio.stacktracer.TracingImplicits.disableAutoTrace import java.util.concurrent.{ScheduledExecutorService, TimeUnit} -abstract class Scheduler { +sealed abstract class Scheduler { def schedule(task: Runnable, duration: Duration)(implicit unsafe: Unsafe): CancelToken } object Scheduler { type CancelToken = () => Boolean + private[zio] abstract class Internal extends Scheduler + def fromScheduledExecutorService(service: ScheduledExecutorService): Scheduler = new Scheduler { val ConstFalse = () => false diff --git a/core/jvm-native/src/main/scala/zio/ClockPlatformSpecific.scala b/core/jvm-native/src/main/scala/zio/ClockPlatformSpecific.scala index 701317470100..10b79222623d 100644 --- a/core/jvm-native/src/main/scala/zio/ClockPlatformSpecific.scala +++ b/core/jvm-native/src/main/scala/zio/ClockPlatformSpecific.scala @@ -24,7 +24,7 @@ import java.util.concurrent._ private[zio] trait ClockPlatformSpecific { import Scheduler.CancelToken - private[zio] val globalScheduler = new Scheduler { + private[zio] val globalScheduler = new Scheduler.Internal { private[this] val service = makeService() diff --git a/core/jvm-native/src/main/scala/zio/Scheduler.scala b/core/jvm-native/src/main/scala/zio/Scheduler.scala index a73d1010f902..238214b87be5 100644 --- a/core/jvm-native/src/main/scala/zio/Scheduler.scala +++ b/core/jvm-native/src/main/scala/zio/Scheduler.scala @@ -21,7 +21,7 @@ import zio.stacktracer.TracingImplicits.disableAutoTrace import java.util.concurrent.{ScheduledExecutorService, TimeUnit} -abstract class Scheduler { +sealed abstract class Scheduler { def asScheduledExecutorService: ScheduledExecutorService def schedule(task: Runnable, duration: Duration)(implicit unsafe: Unsafe): CancelToken } @@ -29,6 +29,8 @@ abstract class Scheduler { object Scheduler { type CancelToken = () => Boolean + private[zio] abstract class Internal extends Scheduler + def fromScheduledExecutorService(service: ScheduledExecutorService): Scheduler = new Scheduler { val ConstFalse = () => false diff --git a/core/shared/src/main/scala/zio/Cached.scala b/core/shared/src/main/scala/zio/Cached.scala index 8028d3ca7f0e..010eb663bb4f 100644 --- a/core/shared/src/main/scala/zio/Cached.scala +++ b/core/shared/src/main/scala/zio/Cached.scala @@ -19,7 +19,7 @@ package zio * A [[Cached]] is a possibly resourceful value that is loaded into memory, and * which can be refreshed either manually or automatically. */ -trait Cached[+Error, +Resource] { +sealed trait Cached[+Error, +Resource] { /** * Retrieves the current value stored in the cache. diff --git a/core/shared/src/main/scala/zio/Dequeue.scala b/core/shared/src/main/scala/zio/Dequeue.scala index 4dd59ffe9037..c4b1bf8451ac 100644 --- a/core/shared/src/main/scala/zio/Dequeue.scala +++ b/core/shared/src/main/scala/zio/Dequeue.scala @@ -19,7 +19,7 @@ package zio /** * A queue that can only be dequeued. */ -trait Dequeue[+A] extends Serializable { +sealed trait Dequeue[+A] extends Serializable { /** * Waits until the queue is shutdown. The `IO` returned by this method will @@ -114,3 +114,6 @@ trait Dequeue[+A] extends Serializable { def poll(implicit trace: Trace): UIO[Option[A]] = takeUpTo(1).map(_.headOption) } +private[zio] object Dequeue { + private[zio] abstract class Internal[+A] extends Dequeue[A] +} diff --git a/core/shared/src/main/scala/zio/Enqueue.scala b/core/shared/src/main/scala/zio/Enqueue.scala index a3e0dd9ae3ad..17733d8a9947 100644 --- a/core/shared/src/main/scala/zio/Enqueue.scala +++ b/core/shared/src/main/scala/zio/Enqueue.scala @@ -19,7 +19,7 @@ package zio /** * A queue that can only be enqueued. */ -trait Enqueue[-A] extends Serializable { +sealed trait Enqueue[-A] extends Serializable { /** * Waits until the queue is shutdown. The `IO` returned by this method will @@ -87,3 +87,6 @@ trait Enqueue[-A] extends Serializable { def isFull(implicit trace: Trace): UIO[Boolean] = size.map(_ >= capacity) } +private[zio] object Enqueue { + private[zio] trait Internal[-A] extends Enqueue[A] +} diff --git a/core/shared/src/main/scala/zio/FiberRef.scala b/core/shared/src/main/scala/zio/FiberRef.scala index 1e2117597753..6d733bf1861d 100644 --- a/core/shared/src/main/scala/zio/FiberRef.scala +++ b/core/shared/src/main/scala/zio/FiberRef.scala @@ -53,7 +53,7 @@ import zio.metrics.MetricLabel * Here `value` will be 2 as the value in the joined fiber is lower and we * specified `max` as our combining function. */ -trait FiberRef[A] extends Serializable { self => +sealed trait FiberRef[A] extends Serializable { self => /** * The type of the value of the `FiberRef`. diff --git a/core/shared/src/main/scala/zio/Hub.scala b/core/shared/src/main/scala/zio/Hub.scala index fded13b2e99f..76de187de686 100644 --- a/core/shared/src/main/scala/zio/Hub.scala +++ b/core/shared/src/main/scala/zio/Hub.scala @@ -26,7 +26,7 @@ import java.util.concurrent.atomic.AtomicBoolean * A `Hub` is an asynchronous message hub. Publishers can offer messages to the * hub and subscribers can subscribe to take messages from the hub. */ -abstract class Hub[A] extends Enqueue[A] { +sealed abstract class Hub[A] extends Enqueue.Internal[A] { /** * Publishes a message to the hub, returning whether the message was published @@ -213,7 +213,7 @@ object Hub { shutdownFlag: AtomicBoolean, strategy: Strategy[A] ): Dequeue[A] = - new Dequeue[A] { self => + new Dequeue.Internal[A] { self => def awaitShutdown(implicit trace: Trace): UIO[Unit] = shutdownHook.await val capacity: Int = diff --git a/core/shared/src/main/scala/zio/Queue.scala b/core/shared/src/main/scala/zio/Queue.scala index e17a72e6faea..0e7341eb2e32 100644 --- a/core/shared/src/main/scala/zio/Queue.scala +++ b/core/shared/src/main/scala/zio/Queue.scala @@ -26,7 +26,7 @@ import scala.annotation.tailrec * A `Queue` is a lightweight, asynchronous queue into which values can be * enqueued and of which elements can be dequeued. */ -abstract class Queue[A] extends Dequeue[A] with Enqueue[A] { +sealed abstract class Queue[A] extends Dequeue.Internal[A] with Enqueue.Internal[A] { /** * Checks whether the queue is currently empty. @@ -42,6 +42,7 @@ abstract class Queue[A] extends Dequeue[A] with Enqueue[A] { } object Queue extends QueuePlatformSpecific { + private[zio] abstract class Internal[A] extends Queue[A] /** * Makes a new bounded queue. When the capacity of the queue is reached, any diff --git a/core/shared/src/main/scala/zio/Ref.scala b/core/shared/src/main/scala/zio/Ref.scala index ffacf27c2f0f..341fa26861ea 100644 --- a/core/shared/src/main/scala/zio/Ref.scala +++ b/core/shared/src/main/scala/zio/Ref.scala @@ -203,7 +203,7 @@ object Ref extends Serializable { * semantically block other writers, while multiple readers can read * simultaneously. */ - abstract class Synchronized[A] extends Ref[A] { + sealed abstract class Synchronized[A] extends Ref[A] { /** * Reads the value from the `Ref`. @@ -295,6 +295,7 @@ object Ref extends Serializable { } object Synchronized { + private[zio] abstract class Internal[A] extends Synchronized[A] /** * Creates a new `Ref.Synchronized` with the specified value. diff --git a/core/shared/src/main/scala/zio/Runtime.scala b/core/shared/src/main/scala/zio/Runtime.scala index f2698bdcdd2d..0844f37f2247 100644 --- a/core/shared/src/main/scala/zio/Runtime.scala +++ b/core/shared/src/main/scala/zio/Runtime.scala @@ -24,7 +24,7 @@ import scala.concurrent.Future /** * A `Runtime[R]` is capable of executing tasks within an environment `R`. */ -trait Runtime[+R] { self => +sealed trait Runtime[+R] { self => /** * The environment of the runtime. @@ -207,6 +207,7 @@ trait Runtime[+R] { self => } object Runtime extends RuntimePlatformSpecific { + private[zio] abstract class Internal[+R] extends Runtime[R] def addFatal(fatal: Class[_ <: Throwable])(implicit trace: Trace): ZLayer[Any, Nothing, Unit] = ZLayer.scoped(FiberRef.currentFatal.locallyScopedWith(_ | IsFatal(fatal))) diff --git a/core/shared/src/main/scala/zio/Scope.scala b/core/shared/src/main/scala/zio/Scope.scala index 3031890c940d..cbff11726798 100644 --- a/core/shared/src/main/scala/zio/Scope.scala +++ b/core/shared/src/main/scala/zio/Scope.scala @@ -27,7 +27,7 @@ import scala.collection.immutable.LongMap * to the scope, and `close`, which closes a scope and runs all finalizers that * have been added to the scope. */ -trait Scope extends Serializable { self => +sealed trait Scope extends Serializable { self => /** * Adds a finalizer to this scope. The finalizer is guaranteed to be run when diff --git a/core/shared/src/main/scala/zio/ScopedRef.scala b/core/shared/src/main/scala/zio/ScopedRef.scala index b14b81377a7c..98cd8ff04a52 100644 --- a/core/shared/src/main/scala/zio/ScopedRef.scala +++ b/core/shared/src/main/scala/zio/ScopedRef.scala @@ -23,7 +23,7 @@ package zio * resources). The reference itself takes care of properly releasing resources * for the old value whenever a new value is obtained. */ -trait ScopedRef[A] { +sealed trait ScopedRef[A] { /** * Sets the value of this reference to the specified resourcefully-created diff --git a/core/shared/src/main/scala/zio/ThreadLocalBridge.scala b/core/shared/src/main/scala/zio/ThreadLocalBridge.scala index 4a0e124db43d..fe598c2649fb 100644 --- a/core/shared/src/main/scala/zio/ThreadLocalBridge.scala +++ b/core/shared/src/main/scala/zio/ThreadLocalBridge.scala @@ -5,7 +5,7 @@ import zio.stacktracer.TracingImplicits.disableAutoTrace import java.util.concurrent.atomic.AtomicReference -trait ThreadLocalBridge { +sealed trait ThreadLocalBridge { def makeFiberRef[A](initialValue: A)(link: A => Unit): ZIO[Scope, Nothing, FiberRef[A]] } diff --git a/core/shared/src/main/scala/zio/ZIO.scala b/core/shared/src/main/scala/zio/ZIO.scala index a0d882f68b0f..6cd77e9282b0 100644 --- a/core/shared/src/main/scala/zio/ZIO.scala +++ b/core/shared/src/main/scala/zio/ZIO.scala @@ -6020,7 +6020,7 @@ object ZIO extends ZIOCompanionPlatformSpecific with ZIOCompanionVersionSpecific } } - trait ZIOConstructorLowPriority1 extends ZIOConstructorLowPriority2 { + sealed trait ZIOConstructorLowPriority1 extends ZIOConstructorLowPriority2 { /** * Constructs a `ZIO[Any, E, A]` from an `Either[E, A]`. @@ -6059,7 +6059,7 @@ object ZIO extends ZIOCompanionPlatformSpecific with ZIOCompanionVersionSpecific } } - trait ZIOConstructorLowPriority2 extends ZIOConstructorLowPriority3 { + sealed trait ZIOConstructorLowPriority2 extends ZIOConstructorLowPriority3 { /** * Constructs a `ZIO[Any, Throwable, A]` from an `A`. diff --git a/core/shared/src/main/scala/zio/ZInputStream.scala b/core/shared/src/main/scala/zio/ZInputStream.scala index db297754040d..04f1bd944f7f 100644 --- a/core/shared/src/main/scala/zio/ZInputStream.scala +++ b/core/shared/src/main/scala/zio/ZInputStream.scala @@ -20,7 +20,7 @@ import zio.stacktracer.TracingImplicits.disableAutoTrace import java.io.IOException -trait ZInputStream { +sealed trait ZInputStream { def readN(n: Int)(implicit trace: Trace): IO[Option[IOException], Chunk[Byte]] def skip(n: Long)(implicit trace: Trace): IO[IOException, Long] def readAll(bufferSize: Int)(implicit trace: Trace): IO[Option[IOException], Chunk[Byte]] diff --git a/core/shared/src/main/scala/zio/ZKeyedPool.scala b/core/shared/src/main/scala/zio/ZKeyedPool.scala index 97f35445c899..60fcaf692379 100644 --- a/core/shared/src/main/scala/zio/ZKeyedPool.scala +++ b/core/shared/src/main/scala/zio/ZKeyedPool.scala @@ -18,7 +18,7 @@ package zio import zio.internal.Platform -trait ZKeyedPool[+Err, -Key, Item] { +sealed trait ZKeyedPool[+Err, -Key, Item] { /** * Retrieves an item from the pool belonging to the given key in a scoped diff --git a/core/shared/src/main/scala/zio/ZLayer.scala b/core/shared/src/main/scala/zio/ZLayer.scala index e98b80549d9a..33ed97a8be35 100644 --- a/core/shared/src/main/scala/zio/ZLayer.scala +++ b/core/shared/src/main/scala/zio/ZLayer.scala @@ -574,7 +574,7 @@ object ZLayer extends ZLayerCompanionVersionSpecific { * correct type inference and dependency resolution during `ZLayer` * derivation. */ - trait Default[+A] { + sealed trait Default[+A] { type R type E @@ -967,7 +967,7 @@ object ZLayer extends ZLayerCompanionVersionSpecific { * a function of type `Input`. This allows the type of the `ZLayer` value * constructed to depend on `Input`. */ - trait FunctionConstructor[In] { + sealed trait FunctionConstructor[In] { /** * The type of the `ZLayer` value. diff --git a/core/shared/src/main/scala/zio/ZOutputStream.scala b/core/shared/src/main/scala/zio/ZOutputStream.scala index fd3400741124..31e06eca9684 100644 --- a/core/shared/src/main/scala/zio/ZOutputStream.scala +++ b/core/shared/src/main/scala/zio/ZOutputStream.scala @@ -20,7 +20,7 @@ import zio.stacktracer.TracingImplicits.disableAutoTrace import java.io.IOException -trait ZOutputStream { +sealed trait ZOutputStream { def write(chunk: Chunk[Byte])(implicit trace: Trace): IO[IOException, Unit] } diff --git a/core/shared/src/main/scala/zio/package.scala b/core/shared/src/main/scala/zio/package.scala index a01775c85c81..179c31f94dae 100644 --- a/core/shared/src/main/scala/zio/package.scala +++ b/core/shared/src/main/scala/zio/package.scala @@ -46,7 +46,7 @@ package object zio type Trace = Tracer.instance.Type with Tracer.Traced - trait Tag[A] extends EnvironmentTag[A] { + sealed trait Tag[A] extends EnvironmentTag[A] { def tag: LightTypeTag } diff --git a/core/shared/src/main/scala/zio/stm/TDequeue.scala b/core/shared/src/main/scala/zio/stm/TDequeue.scala index 4b28ffde3b1f..6e6165f42bb4 100644 --- a/core/shared/src/main/scala/zio/stm/TDequeue.scala +++ b/core/shared/src/main/scala/zio/stm/TDequeue.scala @@ -21,7 +21,7 @@ import zio._ /** * A transactional queue that can only be dequeued. */ -trait TDequeue[+A] extends Serializable { +sealed trait TDequeue[+A] extends Serializable { /** * The maximum capacity of the queue. @@ -138,3 +138,6 @@ trait TDequeue[+A] extends Serializable { final def takeN(n: Int): ZSTM[Any, Nothing, Chunk[A]] = takeBetween(n, n) } +private[zio] object TDequeue { + private[zio] abstract class Internal[+A] extends TDequeue[A] +} diff --git a/core/shared/src/main/scala/zio/stm/TEnqueue.scala b/core/shared/src/main/scala/zio/stm/TEnqueue.scala index cb77b503b99f..ec516551c678 100644 --- a/core/shared/src/main/scala/zio/stm/TEnqueue.scala +++ b/core/shared/src/main/scala/zio/stm/TEnqueue.scala @@ -21,7 +21,7 @@ import zio._ /** * A transactional queue that can only be enqueued. */ -trait TEnqueue[-A] extends Serializable { +sealed trait TEnqueue[-A] extends Serializable { /** * The maximum capacity of the queue. @@ -73,3 +73,6 @@ trait TEnqueue[-A] extends Serializable { def isFull: USTM[Boolean] = size.map(_ == capacity) } +private[zio] object TEnqueue { + private[zio] trait Internal[-A] extends TEnqueue[A] +} diff --git a/core/shared/src/main/scala/zio/stm/THub.scala b/core/shared/src/main/scala/zio/stm/THub.scala index 4645ac1704eb..a7676933baac 100644 --- a/core/shared/src/main/scala/zio/stm/THub.scala +++ b/core/shared/src/main/scala/zio/stm/THub.scala @@ -23,7 +23,7 @@ import zio.stacktracer.TracingImplicits.disableAutoTrace * A `THub` is a transactional message hub. Publishers can publish messages to * the hub and subscribers can subscribe to take messages from the hub. */ -abstract class THub[A] extends TEnqueue[A] { +sealed abstract class THub[A] extends TEnqueue.Internal[A] { /** * Publishes a message to the hub, returning whether the message was published @@ -253,7 +253,7 @@ object THub { subscriberCount: TRef[Int], subscribers: TRef[Set[TRef[TRef[Node[A]]]]] ): TDequeue[A] = - new TDequeue[A] { + new TDequeue.Internal[A] { override def capacity: Int = requestedCapacity override def isShutdown: USTM[Boolean] = diff --git a/core/shared/src/main/scala/zio/stm/TQueue.scala b/core/shared/src/main/scala/zio/stm/TQueue.scala index 40205b2f7f5f..8598d7119ecb 100644 --- a/core/shared/src/main/scala/zio/stm/TQueue.scala +++ b/core/shared/src/main/scala/zio/stm/TQueue.scala @@ -25,7 +25,7 @@ import scala.collection.immutable.{Queue => ScalaQueue} * A `TQueue` is a transactional queue. Offerors can offer values to the queue * and takers can take values from the queue. */ -trait TQueue[A] extends TDequeue[A] with TEnqueue[A] { +sealed trait TQueue[A] extends TDequeue.Internal[A] with TEnqueue.Internal[A] { override final def awaitShutdown: USTM[Unit] = isShutdown.flatMap(b => if (b) ZSTM.unit else ZSTM.retry) diff --git a/managed/shared/src/main/scala/zio/managed/ZManaged.scala b/managed/shared/src/main/scala/zio/managed/ZManaged.scala index 2a7a7ea49d3a..ee009d2c1ce8 100644 --- a/managed/shared/src/main/scala/zio/managed/ZManaged.scala +++ b/managed/shared/src/main/scala/zio/managed/ZManaged.scala @@ -2432,7 +2432,7 @@ object ZManaged extends ZManagedPlatformSpecific { * [[ZManaged]] to the `apply` method will create (inside an effect) a managed * resource which is already acquired and cannot fail. */ - abstract class PreallocationScope { + sealed abstract class PreallocationScope { def apply[R, E, A](managed: => ZManaged[R, E, A]): ZIO[R, E, Managed[Nothing, A]] } @@ -2507,7 +2507,7 @@ object ZManaged extends ZManagedPlatformSpecific { * managed resource to the `apply` method will return an effect that allocates * the resource and returns it with an early-release handle. */ - abstract class Scope { + sealed abstract class Scope { def apply[R, E, A](managed: => ZManaged[R, E, A]): ZIO[R, E, (ZManaged.Finalizer, A)] } diff --git a/streams-tests/shared/src/test/scala/zio/stream/ZSinkSpec.scala b/streams-tests/shared/src/test/scala/zio/stream/ZSinkSpec.scala index d8b1195112f3..1cb1244491f6 100644 --- a/streams-tests/shared/src/test/scala/zio/stream/ZSinkSpec.scala +++ b/streams-tests/shared/src/test/scala/zio/stream/ZSinkSpec.scala @@ -829,7 +829,7 @@ object ZSinkSpec extends ZIOBaseSpec { suite("fromQueueWithShutdown")( test("should enqueue all elements and shutsdown queue") { - def createQueueSpy[A](q: Queue[A]) = new Queue[A] { + def createQueueSpy[A](q: Queue[A]) = new Queue.Internal[A] { @volatile private var isShutDown = false diff --git a/streams/shared/src/main/scala/zio/stream/SubscriptionRef.scala b/streams/shared/src/main/scala/zio/stream/SubscriptionRef.scala index e971f0c5ff3b..289c29d408b4 100644 --- a/streams/shared/src/main/scala/zio/stream/SubscriptionRef.scala +++ b/streams/shared/src/main/scala/zio/stream/SubscriptionRef.scala @@ -23,7 +23,7 @@ import zio.stacktracer.TracingImplicits.disableAutoTrace * A `SubscriptionRef[A]` is a `Ref` that can be subscribed to in order to * receive the current value as well as all changes to the value. */ -sealed trait SubscriptionRef[A] extends Ref.Synchronized[A] { +sealed trait SubscriptionRef[A] extends Ref.Synchronized.Internal[A] { /** * A stream containing the current value of the `Ref` as well as all changes diff --git a/streams/shared/src/main/scala/zio/stream/ZStream.scala b/streams/shared/src/main/scala/zio/stream/ZStream.scala index 335b77cebd78..887d4535a24b 100644 --- a/streams/shared/src/main/scala/zio/stream/ZStream.scala +++ b/streams/shared/src/main/scala/zio/stream/ZStream.scala @@ -6205,7 +6205,7 @@ object ZStream extends ZStreamPlatformSpecificConstructors { } private def mapDequeue[A, B](dequeue: Dequeue[A])(f: A => B): Dequeue[B] = - new Dequeue[B] { + new Dequeue.Internal[B] { def awaitShutdown(implicit trace: Trace): UIO[Unit] = dequeue.awaitShutdown def capacity: Int = diff --git a/test/js/src/main/scala/zio/test/TestClockPlatformSpecific.scala b/test/js/src/main/scala/zio/test/TestClockPlatformSpecific.scala index ba45aebe90ac..10f6b76f9549 100644 --- a/test/js/src/main/scala/zio/test/TestClockPlatformSpecific.scala +++ b/test/js/src/main/scala/zio/test/TestClockPlatformSpecific.scala @@ -23,7 +23,7 @@ private[test] trait TestClockPlatformSpecific { self: TestClock.Test => def scheduler(implicit trace: Trace): UIO[Scheduler] = ZIO.runtime[Any].map { runtime => - new Scheduler { + new Scheduler.Internal { def schedule(runnable: Runnable, duration: Duration)(implicit unsafe: Unsafe): Scheduler.CancelToken = { val fiber = runtime.unsafe.fork(sleep(duration) *> ZIO.succeed(runnable.run())) diff --git a/test/jvm-native/src/main/scala/zio/test/TestClockPlatformSpecific.scala b/test/jvm-native/src/main/scala/zio/test/TestClockPlatformSpecific.scala index 72c4957e96ab..fedd72395fd7 100644 --- a/test/jvm-native/src/main/scala/zio/test/TestClockPlatformSpecific.scala +++ b/test/jvm-native/src/main/scala/zio/test/TestClockPlatformSpecific.scala @@ -29,7 +29,7 @@ trait TestClockPlatformSpecific { self: TestClock.Test => def scheduler(implicit trace: Trace): UIO[Scheduler] = (ZIO.executor <*> ZIO.runtime[Any]).map { case (executor, runtime) => - new Scheduler { + new Scheduler.Internal { def schedule(runnable: Runnable, duration: Duration)(implicit unsafe: Unsafe): Scheduler.CancelToken = { val fiber = runtime.unsafe.fork((sleep(duration) *> ZIO.succeed(runnable.run()))) From 4cd4f453b4f1b80dc9c400f75e7a5a7dcb6f73ff Mon Sep 17 00:00:00 2001 From: Adam Hearn <22334119+hearnadam@users.noreply.github.com> Date: Fri, 18 Apr 2025 16:01:27 +0900 Subject: [PATCH 2/5] fix mima --- core/js/src/main/scala/zio/ClockPlatformSpecific.scala | 2 +- core/jvm-native/src/main/scala/zio/ClockPlatformSpecific.scala | 2 +- core/shared/src/main/scala/zio/stm/TDequeue.scala | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/js/src/main/scala/zio/ClockPlatformSpecific.scala b/core/js/src/main/scala/zio/ClockPlatformSpecific.scala index 4adf7afc10e8..25d72da023b3 100644 --- a/core/js/src/main/scala/zio/ClockPlatformSpecific.scala +++ b/core/js/src/main/scala/zio/ClockPlatformSpecific.scala @@ -21,7 +21,7 @@ import zio.stacktracer.TracingImplicits.disableAutoTrace import scala.scalajs.js private[zio] trait ClockPlatformSpecific { - private[zio] val globalScheduler = new Scheduler.Internal { + private[zio] val globalScheduler: Scheduler = new Scheduler.Internal { import Scheduler.CancelToken private[this] val ConstFalse = () => false diff --git a/core/jvm-native/src/main/scala/zio/ClockPlatformSpecific.scala b/core/jvm-native/src/main/scala/zio/ClockPlatformSpecific.scala index 10b79222623d..bdf2c62908bf 100644 --- a/core/jvm-native/src/main/scala/zio/ClockPlatformSpecific.scala +++ b/core/jvm-native/src/main/scala/zio/ClockPlatformSpecific.scala @@ -24,7 +24,7 @@ import java.util.concurrent._ private[zio] trait ClockPlatformSpecific { import Scheduler.CancelToken - private[zio] val globalScheduler = new Scheduler.Internal { + private[zio] val globalScheduler: Scheduler = new Scheduler.Internal { private[this] val service = makeService() diff --git a/core/shared/src/main/scala/zio/stm/TDequeue.scala b/core/shared/src/main/scala/zio/stm/TDequeue.scala index 6e6165f42bb4..fa5778a93fa2 100644 --- a/core/shared/src/main/scala/zio/stm/TDequeue.scala +++ b/core/shared/src/main/scala/zio/stm/TDequeue.scala @@ -139,5 +139,5 @@ sealed trait TDequeue[+A] extends Serializable { takeBetween(n, n) } private[zio] object TDequeue { - private[zio] abstract class Internal[+A] extends TDequeue[A] + private[zio] trait Internal[+A] extends TDequeue[A] } From d8b34b595a0fbcdd28e1a71645b4c047180643a2 Mon Sep 17 00:00:00 2001 From: Adam Hearn <22334119+hearnadam@users.noreply.github.com> Date: Mon, 21 Apr 2025 09:58:27 +0900 Subject: [PATCH 3/5] fix docs --- docs/reference/concurrency/hub.md | 4 ++++ docs/reference/stream/subscriptionref.md | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/docs/reference/concurrency/hub.md b/docs/reference/concurrency/hub.md index fd8ec075868c..9aa457da373c 100644 --- a/docs/reference/concurrency/hub.md +++ b/docs/reference/concurrency/hub.md @@ -131,6 +131,10 @@ As you can see, the operators on `Hub` are identical to the ones on `Queue` with In fact, a `Hub` can be viewed as a `Queue` that can only be written to. +```scala mdoc:invisible +trait Enqueue[-A] +``` + ```scala mdoc:nest trait Hub[A] extends Enqueue[A] ``` diff --git a/docs/reference/stream/subscriptionref.md b/docs/reference/stream/subscriptionref.md index 6b7b291b4fe9..d046e6cac203 100644 --- a/docs/reference/stream/subscriptionref.md +++ b/docs/reference/stream/subscriptionref.md @@ -5,6 +5,12 @@ title: "SubscriptionRef" A `SubscriptionRef[A]` is a `Ref` that lets us subscribe to receive the current value along with all changes to that value. +```scala mdoc:invisible +object Ref { + abstract class Synchronized[A] +} +``` + ```scala mdoc import zio._ import zio.stream._ From 6b2ca275d4ed37f1dec04156086b285319cc7476 Mon Sep 17 00:00:00 2001 From: Adam Hearn <22334119+hearnadam@users.noreply.github.com> Date: Sat, 26 Apr 2025 07:01:54 -0700 Subject: [PATCH 4/5] remove: 'sealed' from ZLayer constructors --- core/shared/src/main/scala/zio/ZLayer.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/shared/src/main/scala/zio/ZLayer.scala b/core/shared/src/main/scala/zio/ZLayer.scala index 33ed97a8be35..e98b80549d9a 100644 --- a/core/shared/src/main/scala/zio/ZLayer.scala +++ b/core/shared/src/main/scala/zio/ZLayer.scala @@ -574,7 +574,7 @@ object ZLayer extends ZLayerCompanionVersionSpecific { * correct type inference and dependency resolution during `ZLayer` * derivation. */ - sealed trait Default[+A] { + trait Default[+A] { type R type E @@ -967,7 +967,7 @@ object ZLayer extends ZLayerCompanionVersionSpecific { * a function of type `Input`. This allows the type of the `ZLayer` value * constructed to depend on `Input`. */ - sealed trait FunctionConstructor[In] { + trait FunctionConstructor[In] { /** * The type of the `ZLayer` value. From 7d80b8294db997f3079ee7937e5d74c3a8707457 Mon Sep 17 00:00:00 2001 From: Adam Hearn <22334119+hearnadam@users.noreply.github.com> Date: Wed, 7 May 2025 12:27:34 -0700 Subject: [PATCH 5/5] remove: sealed from 'Runtime' --- benchmarks/src/main/scala/zio/BenchmarkUtil.scala | 4 ++-- core/shared/src/main/scala/zio/Runtime.scala | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/benchmarks/src/main/scala/zio/BenchmarkUtil.scala b/benchmarks/src/main/scala/zio/BenchmarkUtil.scala index 14ea69ff8d62..fb5d72171165 100644 --- a/benchmarks/src/main/scala/zio/BenchmarkUtil.scala +++ b/benchmarks/src/main/scala/zio/BenchmarkUtil.scala @@ -5,7 +5,7 @@ import cats.effect.{Fiber => CFiber, IO => CIO} import scala.concurrent.ExecutionContext -object BenchmarkUtil extends Runtime.Internal[Any] { self => +object BenchmarkUtil extends Runtime[Any] { self => val environment = Runtime.default.environment val fiberRefs = Runtime.default.fiberRefs @@ -39,7 +39,7 @@ object BenchmarkUtil extends Runtime.Internal[Any] { self => Unsafe.unsafe(implicit unsafe => rt.unsafe.run(zio).getOrThrowFiberFailure()) } - private object NoFiberRootsRuntime extends Runtime.Internal[Any] { + private object NoFiberRootsRuntime extends Runtime[Any] { val environment = Runtime.default.environment val fiberRefs = Runtime.default.fiberRefs val runtimeFlags = RuntimeFlags(RuntimeFlag.CooperativeYielding, RuntimeFlag.Interruption) diff --git a/core/shared/src/main/scala/zio/Runtime.scala b/core/shared/src/main/scala/zio/Runtime.scala index 0844f37f2247..fbf7d0fdfdd3 100644 --- a/core/shared/src/main/scala/zio/Runtime.scala +++ b/core/shared/src/main/scala/zio/Runtime.scala @@ -24,7 +24,8 @@ import scala.concurrent.Future /** * A `Runtime[R]` is capable of executing tasks within an environment `R`. */ -sealed trait Runtime[+R] { self => +@deprecatedInheritance("Use Runtime.apply", since = "2.1.18") +trait Runtime[+R] { self => /** * The environment of the runtime. @@ -207,7 +208,6 @@ sealed trait Runtime[+R] { self => } object Runtime extends RuntimePlatformSpecific { - private[zio] abstract class Internal[+R] extends Runtime[R] def addFatal(fatal: Class[_ <: Throwable])(implicit trace: Trace): ZLayer[Any, Nothing, Unit] = ZLayer.scoped(FiberRef.currentFatal.locallyScopedWith(_ | IsFatal(fatal)))