Finitomata :: First Class Documentation
· 1 min read
I have
already introduced
the
finitomata
library, yet another implementation of
Finite Automata
. The main reason Iโve decided to climb the low hill that has not been yet conquered by lazy developers only, was Iโ felt like DSLโ does not fit well the main purpose of
FSM
declaration. Itโs not โฆahemโฆ declarative. The
FSM
โ is best described with a diagram, not with a plain English text.
This is Mambie, by the way. He is 31 and he happily lives in Valencia zoo. He has nothing to do with finite automata at all, but look, how declarative he is. Anyway.
Iโ wanted
FSM
implementation to be as easy and succinct as possible. Thatโs why I have chosen
PlantUML
syntax to declare it. Later I was given
an advise
to support
Mermaid
as well.
The huge advantage of supporting
Mermaid
is that it can be natively embedded into library documentation. Actually,
ex_doc
can do way more of a cool stuff rather than the regular user (read: me) could ever imagine. It natively supports
admonition blocks
,
KaTeX math expressions
,
Vega-Lite plots
, and, yes,
Mermaid graphs
.
Itโs all possible with introducing
before_closing_body_tag
keyword parameter for
docs
section in
mix.exs
file and implementing the respective handler as shown below (the excerpt is taken from
ex_doc
docs.)
docs: [
# ...
before_closing_body_tag: &before_closing_body_tag/1
]
# ...
defp before_closing_body_tag(:html) do
"""
<!-- HTML injected at the end of the <body> element -->
"""
end
defp before_closing_body_tag(_), do: ""
That said, I was able to generate FSM diagrams directly in the documentation of the generated FSM implementation .
defmodule MyFSM do
@moduledoc "FSM implementation for 3-state conditional flow"
@fsm """
s1 --> |to_s2| s2
s1 --> |to_s3| s3
"""
use Finitomata, {@fsm, Finitomata.Mermaid}
end
The above code produces the following documentation
Happy rich documenting!