Current section
Files
Jump to
Current section
Files
lib/reactivity/quality/guarantee.ex
defmodule Reactivity.Quality.Guarantee do
@moduledoc """
Essential operations on guarantees.
For every guarantee, the function semantics needs to be implemented.
"""
@doc """
Returns the propagation semantics of a guarantee or set of guarantees.
"""
def semantics({:fu, _}), do: semantics(:fu)
def semantics({:c, _}), do: semantics(:c)
def semantics({:g, _}), do: semantics(:g)
def semantics({:fp, _}), do: semantics(:fp)
def semantics({:t, _}), do: semantics(:t)
def semantics(:fu), do: :update
def semantics(:c), do: :update
def semantics(:g), do: :update
def semantics(:fp), do: :propagate
def semantics(:t), do: :propagate
def semantics(gs) do
sems = gs
|> Enum.map(fn {cgt, _cgm} -> semantics(cgt) end)
propagate? = sems
|> Enum.any?(fn s -> s == :propagate end)
case propagate? do
true -> :propagate
false -> :update
end
end
@doc """
Combines lists of consistency guarantees.
"""
def combine(gss) do
gss
|> List.flatten
|> Enum.group_by(fn {g, _m} -> g end)
|> Map.values
|> Enum.map(
fn gs ->
Enum.min_by(gs, fn {_g, m} -> m end)
end)
|> List.flatten
end
end