defmodule Dust.Flight do
@moduledoc """
The result of `Dust.single_flight/4`.
- `value` — the materialized result (same shape regardless of `source`).
- `source` — provenance: `:cached` (fresh local hit, no work), `:computed`
(this caller ran `fun`), or `:awaited` (another filler ran it; this caller
rode the result).
- `stale?` — `true` only when a freshness-mode wait timed out and the last
known (stale) value is returned rather than a fresh one.
- `coordinated?` — `false` only on the degraded `on_unavailable: :run_local`
path, where `fun` ran without a lease (possible duplicate work). This is
the one signal that idempotency actually mattered on this call.
"""
@type source :: :cached | :computed | :awaited
@type t :: %__MODULE__{
value: term(),
source: source(),
stale?: boolean(),
coordinated?: boolean()
}
defstruct [:value, :source, stale?: false, coordinated?: true]
@spec new(keyword()) :: t()
def new(opts) do
%__MODULE__{
value: Keyword.fetch!(opts, :value),
source: Keyword.fetch!(opts, :source),
stale?: Keyword.get(opts, :stale?, false),
coordinated?: Keyword.get(opts, :coordinated?, true)
}
end
end