# `Weld.Graph`
[🔗](https://github.com/nshkrdotcom/weld/blob/main/lib/weld/graph.ex#L1)

Immutable workspace graph wrapper built on top of `Multigraph`.

# `external_dep`

```elixir
@type external_dep() :: %{
  app: atom(),
  requirement: String.t() | nil,
  opts: keyword(),
  original: tuple(),
  kind: Weld.Graph.Edge.kind()
}
```

# `project_id`

```elixir
@type project_id() :: String.t()
```

# `t`

```elixir
@type t() :: %Weld.Graph{
  classifications: %{
    optional(project_id()) =&gt; Weld.Workspace.Project.classification()
  },
  dag: Multigraph.t(),
  edges: %{optional({project_id(), project_id()}) =&gt; [Weld.Graph.Edge.t()]},
  external_deps: %{optional(project_id()) =&gt; [external_dep()]},
  projects: %{optional(project_id()) =&gt; Weld.Workspace.Project.t()},
  publication_roles: %{
    optional(project_id()) =&gt; Weld.Workspace.Project.publication_role()
  },
  violations: [Weld.Violation.t()]
}
```

# `add_edge`

```elixir
@spec add_edge(t(), Weld.Graph.Edge.t()) :: t()
```

# `add_external_dep`

```elixir
@spec add_external_dep(t(), project_id(), external_dep()) :: t()
```

# `add_project`

```elixir
@spec add_project(t(), Weld.Workspace.Project.t()) :: t()
```

# `add_violation`

```elixir
@spec add_violation(t(), Weld.Violation.t()) :: t()
```

# `edges`

```elixir
@spec edges(t()) :: [Weld.Graph.Edge.t()]
```

# `external_deps`

```elixir
@spec external_deps(t(), project_id()) :: [external_dep()]
```

# `new`

```elixir
@spec new() :: t()
```

# `path`

```elixir
@spec path(t(), project_id(), project_id(), Weld.Graph.View.t()) ::
  {:ok, [project_id()]} | :no_path
```

# `project`

```elixir
@spec project(t(), project_id()) :: {:ok, Weld.Workspace.Project.t()} | :error
```

# `projects`

```elixir
@spec projects(t()) :: [Weld.Workspace.Project.t()]
```

# `reachable_from`

```elixir
@spec reachable_from(t(), project_id() | [project_id()], Weld.Graph.View.t()) :: [
  project_id()
]
```

# `reaching`

```elixir
@spec reaching(t(), project_id() | [project_id()], Weld.Graph.View.t()) :: [
  project_id()
]
```

# `subgraph`

```elixir
@spec subgraph(t(), Weld.Graph.View.t()) :: Multigraph.t()
```

# `topo_sort`

```elixir
@spec topo_sort(t(), Weld.Graph.View.t()) :: [project_id()]
```

# `violations`

```elixir
@spec violations(t(), map()) :: [Weld.Violation.t()]
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
