sealed trait Hotswap[F[_], R] extends AnyRef
A concurrent data structure that exposes a linear sequence of R
resources as a single
cats.effect.kernel.Resource in F
without accumulation.
A Hotswap is allocated within a cats.effect.kernel.Resource that dictates the scope
of its lifetime. After creation, a Resource[F, R]
can be swapped in by calling swap.
The newly acquired resource is returned and is released either when the Hotswap is
finalized or upon the next call to swap, whichever occurs first.
The following diagram illustrates the linear allocation and release of three resources r1
,
r2
, and r3
cycled through Hotswap:
>----- swap(r1) ---- swap(r2) ---- swap(r3) ----X | | | | | Creation | | | | r1 acquired | | | r2 acquired | | r1 released r3 acquired | r2 released | r3 released
Hotswap is particularly useful when working with effects that cycle through resources, like writing bytes to files or rotating files every N bytes or M seconds. Without Hotswap, such effects leak resources: on each file rotation, a file handle or some internal resource handle accumulates. With Hotswap, the only registered resource is the Hotswap itself, and each file is swapped in only after swapping the previous one out.
Ported from https://github.com/typelevel/fs2.
- Source
- Hotswap.scala
- Alphabetic
- By Inheritance
- Hotswap
- AnyRef
- Any
- Hide All
- Show All
- Public
- Protected
Abstract Value Members
- abstract def clear: F[Unit]
Pops and runs the finalizer of the current resource, if it exists.
- abstract def get: kernel.Resource[F, Option[R]]
Gets the current resource, if it exists.
Gets the current resource, if it exists. The returned resource is guaranteed to be available for the duration of the returned resource.
- abstract def swap(next: kernel.Resource[F, R]): F[R]
Allocates a new resource, closes the previous one if it exists, and returns the newly allocated
R
.Allocates a new resource, closes the previous one if it exists, and returns the newly allocated
R
.When the lifetime of the Hotswap is completed, the resource allocated by the most recent swap will be finalized.
swap finalizes the previous resource immediately, so users must ensure that the old
R
is not used thereafter. Failure to do so may result in an error on the _consumer_ side. In any case, no resources will be leaked.For safer access to the current resource see get, which guarantees that it will not be released while it is being used.
If swap is called after the lifetime of the Hotswap is over, it will raise an error, but will ensure that all resources are finalized before returning.
Concrete Value Members
- final def !=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def ##: Int
- Definition Classes
- AnyRef → Any
- final def ==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def asInstanceOf[T0]: T0
- Definition Classes
- Any
- def clone(): AnyRef
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.CloneNotSupportedException]) @native()
- final def eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- def equals(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef → Any
- def finalize(): Unit
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.Throwable])
- final def getClass(): Class[_ <: AnyRef]
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
- def hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
- final def isInstanceOf[T0]: Boolean
- Definition Classes
- Any
- final def ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- final def notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
- final def notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
- final def synchronized[T0](arg0: => T0): T0
- Definition Classes
- AnyRef
- def toString(): String
- Definition Classes
- AnyRef → Any
- final def wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException]) @native()