# `WardrikEvents.View`

The behaviour for views. A view folds an agent's events, oldest first, into what a screen shows.

    {timeline, cursor} = WardrikEvents.view(MyApp.Events, "acme/triage", WardrikEvents.Timeline)

To keep a view current, stream the log after `cursor` and fold each event into the same state:

    {:ok, stream} = WardrikEvents.stream(MyApp.Events, ["acme/triage"], after: WardrikEvents.Cursor.encode(cursor))

    Enum.reduce(stream, timeline, fn {event, _cursor}, timeline ->
      WardrikEvents.Timeline.handle_event(event, timeline)
    end)

See `WardrikEvents.Timeline`, `WardrikEvents.Runs` and `WardrikEvents.Activity`.

# `handle_event`

```elixir
@callback handle_event(WardrikEvents.CloudEvent.t(), state :: term()) :: term()
```

Folds one event into the state.

# `init`

```elixir
@callback init(opts :: keyword()) :: term()
```

Returns the state before any event.

# `fold`

```elixir
@spec fold(Enumerable.t(WardrikEvents.CloudEvent.t()), module(), keyword()) :: term()
```

Folds `events`, oldest first, into a new state of `view`. `opts` are passed to `c:init/1`.

---

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