Packages

final class ChainedCancelable extends AssignableCancelable

Represents a monix.execution.Cancelable whose underlying cancelable reference can be swapped for another. It can be "chained" to another ChainedCancelable, forwarding all operations to it.

For most purposes it works like a OrderedCancelable:

val s = ChainedCancelable()
s := c1 // sets the underlying cancelable to c1
s := c2 // swaps the underlying cancelable to c2

s.cancel() // also cancels c2

s := c3 // also cancels c3, because s is already canceled

However it can also be linked to another ChainedCancelable reference, forwarding all requests to it:

val source = ChainedCancelable()
val child1 = ChainedCancelable()
val child2 = ChainedCancelable()

// Hence forth forwards all operations on `child1` to `source`
child1.chainTo(source)

// Also forwarding all `child2` operations to `source`.
// This happens because `child1` was linked to `source` first
// but order matters, as `child2` will be linked directly
// to `source` and not to `child1`, in order for `child1` to
// be garbage collected if it goes out of scope ;-)
child2.chainTo(child1)

// Source will be updated with a new Cancelable ref
child1 := Cancelable(() => println("Cancelling (1)"))

// Source will be updated with another Cancelable ref
child2 := Cancelable(() => println("Cancelling (2)"))

source.cancel()
//=> Cancelling (2)

This implementation is a special purpose AssignableCancelable, much like StackedCancelable, to be used in flatMap implementations that need it.

The problem that it solves in Monix's codebase is that various flatMap implementations need to be memory safe. By "chaining" cancelable references, we allow the garbage collector to get rid of references created in a flatMap loop, the goal being to consume a constant amount of memory. Thus this implementation is used for CancelableFuture.

The implementation is also relaxed about the thread-safety of the forwardTo operation, treating it like a semi-final state and using Java 8 getAndSet platform intrinsics for performance reasons.

If unsure about what to use, then you probably don't need ChainedCancelable. Use OrderedCancelable or SingleAssignCancelable for most purposes.

Source
ChainedCancelable.scala
Ordering
  1. Alphabetic
  2. By Inheritance
Inherited
  1. ChainedCancelable
  2. AssignableCancelable
  3. Cancelable
  4. Serializable
  5. AnyRef
  6. Any
  1. Hide All
  2. Show All
Visibility
  1. Public
  2. Protected

Value Members

  1. final def !=(arg0: Any): Boolean
    Definition Classes
    AnyRef → Any
  2. final def ##: Int
    Definition Classes
    AnyRef → Any
  3. def :=(value: Cancelable): ChainedCancelable.this.type

    Updates the internal reference of this assignable cancelable to the given value.

    Updates the internal reference of this assignable cancelable to the given value.

    If this cancelable is already canceled, then value is going to be canceled on assignment as well.

    returns

    this

    Definition Classes
    ChainedCancelableAssignableCancelable
  4. final def ==(arg0: Any): Boolean
    Definition Classes
    AnyRef → Any
  5. final def asInstanceOf[T0]: T0
    Definition Classes
    Any
  6. def cancel(): Unit

    Cancels the unit of work represented by this reference.

    Cancels the unit of work represented by this reference.

    Guaranteed idempotency - calling it multiple times should have the same side-effect as calling it only once. Implementations of this method should also be thread-safe.

    Definition Classes
    ChainedCancelableCancelable
  7. def clone(): AnyRef
    Attributes
    protected[lang]
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.CloneNotSupportedException]) @native() @HotSpotIntrinsicCandidate()
  8. final def eq(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef
  9. def equals(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef → Any
  10. def forwardTo(other: ChainedCancelable): Unit

    Chains this ChainedCancelable to another reference, such that all operations are forwarded to other.

    Chains this ChainedCancelable to another reference, such that all operations are forwarded to other.

    val source = ChainedCancelable()
    val child1 = ChainedCancelable()
    val child2 = ChainedCancelable()
    
    // Hence forth forwards all operations on `child1` to `source`
    child1.chainTo(source)
    
    // Also forwarding all `child2` operations to `source`
    // (this happens because `child1` was linked to `source` first
    // but order matters ;-))
    child2.chainTo(child1)
    
    // Source will be updated with a new Cancelable ref
    child1 := Cancelable(() => println("Cancelling (1)"))
    
    // Source will be updated with another Cancelable ref
    child2 := Cancelable(() => println("Cancelling (2)"))
    
    source.cancel()
    //=> Cancelling (2)
  11. final def getClass(): Class[_ <: AnyRef]
    Definition Classes
    AnyRef → Any
    Annotations
    @native() @HotSpotIntrinsicCandidate()
  12. def hashCode(): Int
    Definition Classes
    AnyRef → Any
    Annotations
    @native() @HotSpotIntrinsicCandidate()
  13. final def isInstanceOf[T0]: Boolean
    Definition Classes
    Any
  14. final def ne(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef
  15. final def notify(): Unit
    Definition Classes
    AnyRef
    Annotations
    @native() @HotSpotIntrinsicCandidate()
  16. final def notifyAll(): Unit
    Definition Classes
    AnyRef
    Annotations
    @native() @HotSpotIntrinsicCandidate()
  17. final def synchronized[T0](arg0: => T0): T0
    Definition Classes
    AnyRef
  18. def toString(): String
    Definition Classes
    AnyRef → Any
  19. final def wait(arg0: Long, arg1: Int): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.InterruptedException])
  20. final def wait(arg0: Long): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.InterruptedException]) @native()
  21. final def wait(): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.InterruptedException])

Deprecated Value Members

  1. def finalize(): Unit
    Attributes
    protected[lang]
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.Throwable]) @Deprecated
    Deprecated

Inherited from AssignableCancelable

Inherited from Cancelable

Inherited from Serializable

Inherited from AnyRef

Inherited from Any

Ungrouped