sealed trait NonEmptyHotswap[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 NonEmptyHotswap 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 NonEmptyHotswap 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 NonEmptyHotswap:

create(r1) ----- swap(r2) ---- swap(r3) ---- X
|                |             |             |
r1 acquired      |             |             |
                 r2 acquired   |             |
                 r1 released   r3 acquired   |
                               r2 released   |
                                             r3 released

NonEmptyHotswap 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 NonEmptyHotswap, such effects leak resources: on each file rotation, a file handle or some internal resource handle accumulates. With NonEmptyHotswap, the only registered resource is the NonEmptyHotswap itself, and each file is swapped in only after swapping the previous one out.

Replaces the deprecated Hotswap with a safer API.

Source
NonEmptyHotswap.scala
Linear Supertypes
Ordering
  1. Alphabetic
  2. By Inheritance
Inherited
  1. NonEmptyHotswap
  2. AnyRef
  3. Any
  1. Hide All
  2. Show All
Visibility
  1. Public
  2. Protected

Abstract Value Members

  1. abstract def get: kernel.Resource[F, R]

    Gets the current resource.

    Gets the current resource. The returned resource is guaranteed to be available for the duration of the returned resource.

  2. abstract def swap(next: kernel.Resource[F, R]): F[Unit]

    Allocates a new resource and closes the previous one.

    Allocates a new resource and closes the previous one.

    When the lifetime of the NonEmptyHotswap 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.

    To access the current resource, use get, which guarantees that it will not be released while it is being used.

    If swap is called after the lifetime of the NonEmptyHotswap is over, it will raise an error, but will ensure that all resources are finalized before returning.

Concrete Value Members

  1. final def !=(arg0: Any): Boolean
    Definition Classes
    AnyRef → Any
  2. final def ##: Int
    Definition Classes
    AnyRef → Any
  3. final def ==(arg0: Any): Boolean
    Definition Classes
    AnyRef → Any
  4. final def asInstanceOf[T0]: T0
    Definition Classes
    Any
  5. def clone(): AnyRef
    Attributes
    protected[lang]
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.CloneNotSupportedException]) @native()
  6. final def eq(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef
  7. def equals(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef → Any
  8. def finalize(): Unit
    Attributes
    protected[lang]
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.Throwable])
  9. final def getClass(): Class[_ <: AnyRef]
    Definition Classes
    AnyRef → Any
    Annotations
    @native()
  10. def hashCode(): Int
    Definition Classes
    AnyRef → Any
    Annotations
    @native()
  11. final def isInstanceOf[T0]: Boolean
    Definition Classes
    Any
  12. final def ne(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef
  13. final def notify(): Unit
    Definition Classes
    AnyRef
    Annotations
    @native()
  14. final def notifyAll(): Unit
    Definition Classes
    AnyRef
    Annotations
    @native()
  15. final def synchronized[T0](arg0: => T0): T0
    Definition Classes
    AnyRef
  16. def toString(): String
    Definition Classes
    AnyRef → Any
  17. final def wait(): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.InterruptedException])
  18. final def wait(arg0: Long, arg1: Int): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.InterruptedException])
  19. final def wait(arg0: Long): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.InterruptedException]) @native()

Inherited from AnyRef

Inherited from Any

Ungrouped