@type propagator_event() :: :domain_change | :bound_change | :min_change | :max_change | :fixed
@callback arguments(args :: list()) :: Arrays.t()
@callback bind(Propagator.t(), source :: any(), variable_field :: atom()) :: Propagator.t()
@callback entailed?(Propagator.t(), state :: map() | nil) :: boolean()
@callback failed?(Propagator.t(), state :: map() | nil) :: boolean()
@callback filter(args :: list(), state :: map(), changes :: map()) :: {:state, map()} | :stable | :fail | propagator_event()
@callback reset(args :: list(), state :: map()) :: map() | nil
@callback reset(args :: list(), state :: map(), opts :: Keyword.t()) :: map() | nil
@callback variables(args :: list()) :: list()