# `DCATR.Directory.Type`
[🔗](https://github.com/dcat-r/dcatr-ex/blob/v0.1.0/lib/dcatr/model/directory/type.ex#L1)

Behaviour for directory-like containers with structural graph organization.

This module defines the structural layer for containers that hold `DCATR.Element`s
(graphs and nested directories). It provides two callbacks for direct member access
and generates derived and recursive functions for traversal.

## Callbacks

- `c:graphs/1` - direct graph members
- `c:directories/1` - direct directory members

## Generated Functions

- `members/1` - all direct elements (`graphs/1 ++ directories/1`)
- `all_graphs/1` - all graphs recursively through sub-directories
- `all_members/1` - all elements recursively through sub-directories
- `find_graph/2` - find a graph by ID recursively

## Usage

Modules that `use DCATR.Directory.Type` get:

- `@behaviour DCATR.Directory.Type` declared
- `use Grax.Schema` included
- Default implementations of 2 callbacks (operating on `members` field)
- Implementations of 4 generated functions (using polymorphic dispatch)
- All 6 functions are `defoverridable`

Override the callbacks when your module uses typed fields instead of `members`:

    @impl DCATR.Directory.Type
    def graphs(%_dataset{special_graph: special, other_graphs: graphs}), do: [special | graphs]

    @impl DCATR.Directory.Type
    def directories(%_dataset{directories: directories}), do: directories || []

# `schema`

```elixir
@type schema() :: Grax.Schema.t()
```

# `t`

```elixir
@type t() :: module()
```

# `directories`

```elixir
@callback directories(container :: schema()) :: [DCATR.Directory.t()]
```

Returns direct directory members only.

# `graphs`

```elixir
@callback graphs(container :: schema()) :: [DCATR.Graph.t()]
```

Returns direct graph members only.

# `all_graphs`

```elixir
@spec all_graphs(schema()) :: [DCATR.Graph.t()]
```

Returns all Graphs through the entire sub-directory tree.

Uses polymorphic dispatch to call the correct `graphs/1` and `directories/1`
on each nested container.

# `all_members`

```elixir
@spec all_members(schema()) :: [DCATR.Element.t()]
```

Returns all Elements through the entire sub-directory tree.

Uses polymorphic dispatch to call the correct `members/1` on each nested container.

# `directories`

```elixir
@spec directories(schema()) :: [DCATR.Directory.t()]
```

Default implementation of `c:directories/1`.

Filters `members` for Directory instances.

# `find_graph`

```elixir
@spec find_graph(schema(), RDF.IRI.coercible()) :: DCATR.Graph.t() | nil
```

Finds a Graph by ID recursively through the sub-directory tree.

Uses polymorphic dispatch to search through nested containers.

# `graphs`

```elixir
@spec graphs(schema()) :: [DCATR.Graph.t()]
```

Default implementation of `c:graphs/1`.

Filters `members` for Graph instances.

# `members`

```elixir
@spec members(schema()) :: [DCATR.Element.t()]
```

Returns all direct element members.

Combines `graphs/1` and `directories/1` via polymorphic dispatch.

---

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