# `Dicom.P10.Stream.Parser`
[🔗](https://github.com/Balneario-de-Cofrentes/dicom/blob/v0.5.1/lib/dicom/p10/stream/parser.ex#L1)

Streaming DICOM P10 state machine parser.

Emits `Dicom.P10.Stream.Event` values as it traverses a DICOM P10 binary.
Tracks state through phases: preamble -> file_meta -> data_set -> done.

Handles sequences, items, and encapsulated pixel data via a nesting stack
with `bytes_consumed_in_frame` tracking for defined-length containers.

This module is not meant to be used directly. Use `Dicom.P10.Stream` instead.

# `frame`

```elixir
@type frame() ::
  {:sequence, non_neg_integer() | :undefined, non_neg_integer()}
  | {:item, non_neg_integer() | :undefined, non_neg_integer()}
  | {:pixel_data, non_neg_integer()}
```

# `state`

```elixir
@type state() :: %{
  phase: :preamble | :file_meta | :data_set | :done,
  source: Dicom.P10.Stream.Source.t(),
  vr_encoding: :implicit | :explicit,
  endianness: :little | :big,
  transfer_syntax_uid: String.t() | nil,
  file_meta: %{required(Dicom.DataElement.tag()) =&gt; Dicom.DataElement.t()},
  stack: [frame()],
  pixel_fragment_index: non_neg_integer()
}
```

# `new`

```elixir
@spec new(Dicom.P10.Stream.Source.t()) :: state()
```

Creates a new parser state from a source.

# `next`

```elixir
@spec next(state()) :: {Dicom.P10.Stream.Event.t(), state()} | nil
```

Advances the parser by one step, returning the next event and updated state.

Returns `{event, state}` or `nil` when parsing is complete.

---

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