final case class ConstEvolution[-I, +O, +E](stage: Stage[I, O, E], _dispose: () =>Unit) extends Evolution[I, O, E]
An Evolution that returns the same constant Stage regardless of the status.
Used by StageOps.toEvolution to lift a stage into an evolution. Being deaf to the status is the point wherever the status reaching this evolution is not the one the constant stage should be chosen by — that is what makes it the evolution the h8io.stages.cycles operators return outwards.
Disposal is not tied to the constant stage: it runs whatever _dispose holds, so the caller decides what this evolution is the cleanup handle for.
Type parameters
E
the error type (covariant)
I
the input type (contravariant)
O
the output type (covariant)
Value parameters
_dispose
the thunk dispose delegates to; a no-op when built by the single-argument ConstEvolution.apply
Releases everything held by the Stage that produced this evolution. That stage is permanently unusable afterwards — neither applied nor skipped again — and this is the only place its resources are released.
Releases everything held by the Stage that produced this evolution. That stage is permanently unusable afterwards — neither applied nor skipped again — and this is the only place its resources are released.
Whoever terminates a pipeline is responsible for disposing the evolution of the final Yield, so that the continuation is released at once instead of being carried around. The reference terminal driver is the execute extension method of h8io.stages.base in the lib module.
dispose() stays valid after evolve has been called on the same instance, and must then release everything still alive, including whatever building the continuation acquired. evolve hands over no ownership: this evolution remains the cleanup point for its lineage until the continuation has run and produced an evolution of its own, which takes the role over from that moment.
Exceptions are not part of this contract: a stage whose apply throws produces no yield and therefore no evolution, so there is nothing to dispose — it must clean up after itself (see the ''Lifecycle'' section in Stage).
A no-op is a fine implementation for a stage holding nothing external.
May release what belongs to this generation alone — anything the returned stage and its own evolution will not reuse.
evolve and dispose are not mutually exclusive. Usually only one of them is called on an instance: a terminal driver disposes, a continuing pipeline evolves and drops the previous evolution. But a caller may do both, and operators owning their inner stage (Loop, Repeat and the rest of h8io.stages.cycles in the lib module) do exactly that — they evolve eagerly and keep the inner dispose as the cleanup handle of the generation they just built.