Loop

h8io.stages.cycles.Loop
final case class Loop[T, +E](alterand: Endo[T, E]) extends Decorator[T, T, E]

A decorator that feeds the output of each successful step back as the input of the next, effectively looping the inner endomorphic stage until it stops.

The tail-recursive loop works as follows:

  • h8io.stages.Status.Success + h8io.stages.Yield.Some: the output becomes the new input and the loop continues with the stage selected by yld.evolve().
  • h8io.stages.Status.Success + h8io.stages.Yield.None: no output was produced; the loop stops and emits a Yield.None with Success status whose continuation is the stage selected by yld.evolve(), wrapped back in Loop.
  • h8io.stages.Status.Complete with no errors: the loop stops, converts the status back to Success, and wraps the stage selected by yld.evolve() in Loop for the next outer invocation.
  • h8io.stages.Status.Complete with errors: the loop stops, preserves the errors, and selects the continuation the same way.

In every branch the continuation of the inner stage is selected by the status the inner stage itself produced, and never by the status Loop reports to the enclosing pipeline — the two differ, since an error-free Complete is absorbed into a Success. For the same reason the returned evolution is a h8io.stages.base.ConstEvolution: the status the enclosing pipeline evolves Loop with belongs to that pipeline, not to the inner stage, and must not be passed inwards. Symmetrically, a skipped Loop skips its inner stage and selects the inner continuation on the neutral Status.Success. The returned ConstEvolution keeps the inner evolution's dispose as its own: per the h8io.stages.Evolution contract, the inner evolution stays the terminal cleanup handle for the generation constructed here until that generation runs.

This makes Loop suitable for in-process iterative computations (e.g., fixed-point iterations) where the result of one step seeds the next.

Type parameters

E

the error type (covariant)

T

the value type (both input and output)

Value parameters

alterand

the inner endomorphic stage T → T to loop

Attributes

Graph
Supertypes
trait Serializable
trait Product
trait Equals
trait Alterator[Stage[T, T, E], T, T, E]
trait Stage[T, T, E]
trait T => Yield[T, T, E]
class Object
trait Matchable
class Any
Show all

Members list

Value members

Concrete methods

override def apply(in: T): Yield[T, T, E]

Processes in and returns the Yield carrying the optional output, the status and the continuation.

Processes in and returns the Yield carrying the optional output, the status and the continuation.

A stage that throws from here must have released its own resources first — see the ''Lifecycle'' section above.

Attributes

Definition Classes
Stage -> Function1
override def skip(): Evolution[T, T, E]

Returns this stage's Evolution without consuming an input.

Returns this stage's Evolution without consuming an input.

Called instead of apply whenever the stage takes part in a run but has nothing to process: the upstream yielded no output, or a binary operator excluded this branch. The evolution must be the one the stage would have returned had it run. Like apply, skip() may perform side effects — a decorator, for instance, may advance or release the inner stage it owns.

Attributes

Definition Classes

Inherited methods

def andThen[A](g: Yield[T, T, E] => A): T => A

Composes two instances of Function1 in a new Function1, with this function applied first.

Composes two instances of Function1 in a new Function1, with this function applied first.

Type parameters

A

the result type of function g

Value parameters

g

a function R => A

Attributes

Returns

a new function f such that f(x) == g(apply(x))

Inherited from:
Function1
def compose[A](g: A => T): A => Yield[T, T, E]

Composes two instances of Function1 in a new Function1, with this function applied last.

Composes two instances of Function1 in a new Function1, with this function applied last.

Type parameters

A

the type to which function g can be applied

Value parameters

g

a function A => T1

Attributes

Returns

a new function f such that f(x) == apply(g(x))

Inherited from:
Function1
def productElementNames: Iterator[String]

An iterator over the names of all the elements of this product.

An iterator over the names of all the elements of this product.

Attributes

Inherited from:
Product
def productIterator: Iterator[Any]

An iterator over all the elements of this product.

An iterator over all the elements of this product.

Attributes

Returns

in the default implementation, an Iterator[Any]

Inherited from:
Product
override def toString(): String

Returns a string representation of the object.

Returns a string representation of the object.

The default representation is platform dependent.

Attributes

Returns

a string representation of the object.

Definition Classes
Function1 -> Any
Inherited from:
Function1
final def ~>[_O, _E >: E](that: Stage[T, _O, _E]): Stage[T, _O, _E]

Composes this stage with that, feeding this stage's output into it. See the ''Composition'' section above for what happens when there is no output to feed.

Composes this stage with that, feeding this stage's output into it. See the ''Composition'' section above for what happens when there is no output to feed.

Attributes

Inherited from:
Stage