
Strategy.pudu
Pudu42 lines1.7 KB
1/** @Resilience.Strategy.Contract — one layer of a resilience pipeline */2module PuduLangResilience.Strategy34import PuduLangResilience.Clock as Clock5import PuduLangResilience.Context as Context6import PuduLangResilience.Randomizer as Randomizer7import PuduLangResilience as Resilience8import PuduLangResilience.Telemetry as Telemetry910/** @Resilience.Strategy.Callback — the work a layer guards */11export type Callback[T, E] = fn(Context.Context) -> Resilience.Outcome[T, E]1213/** @Resilience.Strategy.Runtime — the effects a pipeline lends its layers */14export type Runtime = { clock: Clock.Clock, randomizer: Randomizer.Randomizer, telemetry: Telemetry.Reporter }1516/** @Resilience.Strategy.Execute — runs a callback under one layer's policy */17export type Execute[T, E] = fn(Runtime, Context.Context, Callback[T, E]) -> Resilience.Outcome[T, E]1819/** @Resilience.Strategy.Strategy — a named, validated policy layer */20export type Strategy[T, E] = {21 name: Option[Str],22 kind: Str,23 summary: Str,24 problems: Array[Str],25 attach: fn(Runtime) -> (),26 execute: Execute[T, E]27}28293031export fn custom[T, E](name: Option[Str], kind: Str, execute: Execute[T, E]) -> Strategy[T, E] {32 Strategy{name: name, kind: kind, summary: kind, problems: [], attach: detached, execute: execute}33}343536export fn detached(_runtime: Runtime) -> () { () }373839export fn standalone() -> Runtime {40 Runtime{clock: Clock.system(), randomizer: Randomizer.system(), telemetry: Telemetry.silent()}41}42