-module(graffeo_builder).
-moduledoc """
The build-half behaviour: envelope-based constructors used by
constructive algorithms (`subgraph`, `condensation`).
Each backend implements these callbacks. A constructive algorithm
calls `Backend:empty_like(G)` then threads the result through
`Backend:build_add_vertex` and `Backend:build_add_edge`.
For the value backend each step returns a new envelope (pure).
For the handle backend each step mutates a fresh handle and returns
the same envelope. Algorithms that thread the returned graph work
correctly for both.
**Tier-2 lifecycle note:** constructive algorithms over a handle
graph create a **new** `digraph` handle the caller owns and must
`graffeo_ets:delete/1`.
""".
-doc "A fresh, empty graph of the same backend as `G`.".
-callback empty_like(G :: graffeo:graph()) -> graffeo:graph().
-doc "Add a vertex with the default label (builder).".
-callback build_add_vertex(G :: graffeo:graph(), V :: graffeo:vertex()) ->
graffeo:graph().
-doc "Add a vertex with a label (builder).".
-callback build_add_vertex(G :: graffeo:graph(), V :: graffeo:vertex(), Label :: graffeo:label()) ->
graffeo:graph().
-doc "Add an edge with metadata (builder).".
-callback build_add_edge(
G :: graffeo:graph(),
From :: graffeo:vertex(),
To :: graffeo:vertex(),
Meta :: graffeo:edge_meta()
) ->
graffeo:graph().