Packages
finitomata
0.26.1
0.41.0
0.40.0
0.35.0
0.34.0
0.33.0
0.32.0
0.31.1
0.30.3
0.30.2
0.30.1
0.30.0
0.29.10
0.29.9
0.29.8
0.29.7
0.29.6
0.29.5
0.29.4
0.29.3
0.29.2
0.29.1
0.29.0
0.28.1
0.28.0
0.27.1
0.27.0
0.26.4
0.26.3
0.26.2
0.26.1
0.26.0
0.25.0
0.24.4
0.24.3
0.24.2
0.24.1
0.24.0
0.23.7
0.23.6
0.23.5
0.23.4
0.23.3
0.23.2
0.23.1
0.23.0
0.22.1
0.22.0
0.21.4
0.21.3
0.21.2
0.21.1
0.21.0
0.20.2
0.20.1
0.20.0
0.19.6
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.19.0
0.18.4
0.18.3
0.18.2
0.18.1
0.18.0
0.17.1
0.17.0
0.16.0
0.15.1
0.15.0
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.0
0.12.1
0.12.0
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.1
0.9.0
0.8.2
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.0
0.3.0
0.2.0
0.1.1
0.1.0
The FSM implementation generated from PlantUML textual representation.
Current section
Files
Jump to
Current section
Files
lib/finitomata/persistency/persistable.ex
defprotocol Finitomata.Persistency.Persistable do
@moduledoc """
The protocol to be implemented for custom data to be used in pair with
`Finitomata.Persistency.Protocol` persistency adapter.
For that combination, one should implement the protocol for that particular
struct _and_ specify `Finitomata.Persistency.Protocol` as a `persistency`
in a call to `use Finitomata`.
```elixir
use Finitomata, …, persistency: Finitomata.Persistency.Protocol
```
"""
@fallback_to_any false
@doc "Loads the entity from some external storage"
def load(data)
@doc "Persists the transitioned entity to some external storage"
def store(data, info)
@doc "Persists the error happened while an attempt to transition the entity"
def store_error(data, reason, info)
end
defimpl Finitomata.Persistency.Persistable,
for: [
Any,
Atom,
BitString,
Float,
Function,
Integer,
List,
Map,
PID,
Port,
Reference
] do
def load(data) do
raise Protocol.UndefinedError, protocol: __MODULE__, value: data
end
def store(data, _info) do
raise Protocol.UndefinedError, protocol: __MODULE__, value: data
end
def store_error(data, _reason, _info) do
raise Protocol.UndefinedError, protocol: __MODULE__, value: data
end
end
defimpl Finitomata.Persistency.Persistable, for: Tuple do
alias Finitomata.Persistency.Persistable, as: Proto
def load({module, fields}) when is_list(fields),
do: load({module, Map.new(fields)})
def load({module, fields}) when is_map(fields) do
defines_struct? = fn module ->
:functions
|> module.__info__()
|> Keyword.take([:__struct__])
|> Keyword.values() == [0, 1]
end
with true <- Code.ensure_loaded?(module),
true <- defines_struct?.(module),
%^module{} = result <- struct(module, fields),
impl when not is_nil(impl) <- Proto.impl_for(result) do
Proto.load(result)
else
_ -> {:unknown, nil}
end
end
def load({module, loader}) when is_function(loader, 1) do
loader.(module)
end
def store({data, storer}, info) when is_function(storer, 2) do
storer.(data, info)
end
def store_error({data, storer}, reason, info) when is_function(storer, 3) do
storer.(data, reason, info)
end
end