final case class Safe[-I, +O, +E](alterand: Stage[I, O, E]) extends Alterator[Stage[I, O, E], I, O, Either[Throwable, E]] with SafeStage[I, O, Either[Throwable, E]] with Product with Serializable
A decorator that catches non-fatal exceptions thrown by the inner stage and converts them into
h8io.stages.Status.Complete error values.
The error type is widened from E to Either[Throwable, E]:
- Errors already carried by the inner stage are wrapped as
Right(e). - Exceptions caught during
applyare reported asLeft(throwable)in aYield.None(Status.error(Left(e)), this).
Only non-fatal exceptions (matched by scala.util.control.NonFatal) are caught; fatal errors such as
OutOfMemoryError propagate normally.
The evolution is mapped so that every continuation stage remains wrapped in Safe, maintaining exception safety
across the entire pipeline.
Safe is a crutch for the simplest cases — stateless stages. Per the Lifecycle contract in
h8io.stages.Stage, a stage that throws from apply has already released its own resources, so the recovered
continuation simply reuses the inner stage — retrying it on the next input — and carries a no-op dispose. A stage
that owns resources should be made safe by itself instead of being wrapped: extend h8io.stages.base.SafeStage
and supply a recover with the appropriate cleanup (the h8io.stages.base.ConstEvolution overload taking a
dispose function exists for exactly this).
- I
the input type (contravariant)
- O
the output type (covariant)
- E
the original error type of the inner stage (covariant)
- alterand
the inner stage whose exceptions should be caught
- Alphabetic
- By Inheritance
- Safe
- Serializable
- Serializable
- Product
- Equals
- SafeStage
- Alterator
- Stage
- Function1
- AnyRef
- Any
- Hide All
- Show All
- Public
- All
Instance Constructors
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
-
val
alterand: Stage[I, O, E]
The wrapped stage whose behavior is modified by this operator.
-
def
andThen[A](g: (Yield[I, O, Either[Throwable, E]]) ⇒ A): (I) ⇒ A
- Definition Classes
- Function1
- Annotations
- @unspecialized()
-
final
def
apply(in: I): Yield[I, O, Either[Throwable, E]]
Processes
inand returns the Yield carrying the optional output, the status and the continuation. -
final
def
asInstanceOf[T0]: T0
- Definition Classes
- Any
-
def
body(in: I): Yield[I, O, Either[Throwable, E]]
The main execution logic invoked on each input.
-
def
clone(): AnyRef
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( ... ) @native() @IntrinsicCandidate()
-
def
compose[A](g: (A) ⇒ I): (A) ⇒ Yield[I, O, Either[Throwable, E]]
- Definition Classes
- Function1
- Annotations
- @unspecialized()
-
final
def
eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
final
def
getClass(): Class[_]
- Definition Classes
- AnyRef → Any
- Annotations
- @native() @IntrinsicCandidate()
-
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() @IntrinsicCandidate()
-
final
def
notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native() @IntrinsicCandidate()
-
def
recover(in: I, e: Throwable): Yield[I, O, Either[Throwable, E]]
Called when body throws a non-fatal exception.
-
def
skip(): Evolution[I, O, Either[Throwable, E]]
Returns this stage's Evolution without consuming an input.
Returns this stage's Evolution without consuming an input.
Called instead of
applywhenever 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. Likeapply,skip()may perform side effects — a decorator, for instance, may advance or release the inner stage it owns. -
final
def
synchronized[T0](arg0: ⇒ T0): T0
- Definition Classes
- AnyRef
-
def
toString(): String
- Definition Classes
- Function1 → AnyRef → Any
-
final
def
wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... ) @native()
-
final
def
wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
~>[_O, _E >: Either[Throwable, E]](that: Stage[O, _O, _E]): Stage[I, _O, _E]
Composes this stage with
that, feeding this stage's output into it.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.- Definition Classes
- Stage
- Annotations
- @inline()
Deprecated Value Members
-
def
finalize(): Unit
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( classOf[java.lang.Throwable] ) @Deprecated
- Deprecated