Packages
double_down
0.56.0
0.69.0
0.68.0
0.66.0
0.65.0
0.64.1
0.64.0
0.63.3
0.63.2
0.63.1
0.63.0
0.62.1
0.61.0
0.60.4
0.60.3
0.60.2
0.60.1
0.60.0
0.59.0
0.58.0
0.57.0
0.56.1
0.56.0
0.55.0
0.54.0
0.53.0
0.52.3
0.52.2
0.52.1
0.52.0
0.51.0
0.50.1
0.50.0
0.49.0
0.48.1
0.48.0
0.47.2
0.47.1
0.47.0
0.46.3
0.46.2
0.46.1
0.46.0
0.45.0
0.44.0
0.43.0
0.42.0
0.41.1
0.41.0
0.40.0
0.39.0
0.38.0
0.37.2
0.37.0
0.35.0
0.34.0
0.33.0
0.32.0
0.31.1
0.31.0
0.30.1
0.30.0
0.29.0
0.28.1
0.28.0
0.27.0
0.26.0
0.24.0
Builds on the Mox pattern — generates behaviours and dispatch facades from `defcallback` declarations — and adds stateful test doubles powerful enough to test Ecto.Repo operations without a database.
Current section
Files
Jump to
Current section
Files
lib/double_down/contract/dispatch/defer.ex
defmodule DoubleDown.Contract.Dispatch.Defer do
@moduledoc """
A deferred execution marker.
When a handler or test double returns `%DoubleDown.Contract.Dispatch.Defer{fun: fun}`,
the dispatch system releases the NimbleOwnership lock before calling
`fun.()`. This avoids deadlocks when the deferred function makes
further dispatched calls (e.g. `transact` calling `insert` inside
its body).
**For users of the Double API**, prefer `DoubleDown.Double.defer/1`
over constructing this struct directly.
Used internally by `Repo.Stub`, `Repo.OpenInMemory`, and
`DoubleDown.Double`'s canonical handler.
"""
@enforce_keys [:fun]
defstruct [:fun]
@type t :: %__MODULE__{fun: (-> term())}
@doc "Create a new Defer marker. Validates that `fun` is a 0-arity function."
@spec new((-> term())) :: t()
def new(fun) when is_function(fun, 0), do: %__MODULE__{fun: fun}
end