# `Macaw.Data.Derived.Context`
[🔗](https://github.com/dcoai/macaw_data/blob/v0.5.3/lib/macaw/data/derived/context.ex#L1)

The context a derived source's function of two arguments is called with (spec/02 §2.3):
each input's schema as data and its delivery's served facts. It holds no clock and no
variables: a variable is an input like any other.

Every name is a string: a field's, a description's key, a value entry's key. A value is
the term the schema or the delivery holds, read through `value`: a stored function's by
the rule its literals follow (a word's atom, else the string), a host's as given.

    iex> alias Macaw.Data.{Delivery, Schema}
    iex> schema = Schema.new!(%{cpu: %{type: :number, bounds: [0, 100]}})
    iex> delivery = Delivery.new([%{cpu: 3}], served: [window: [0, 10], capped: true])
    iex> Macaw.Data.Derived.Context.new([%{key: "hosts", delivery: delivery, schema: schema}])
    %{"inputs" => %{"hosts" => %{"schema" => %{"cpu" => %{"bounds" => [0, 100], "type" => :number}},
      "window" => [0, 10], "resolution" => nil, "capped" => true}}}

Ported from visualize's `Visualize.VirtualSource.Context`, its `"vars"` left out
(spec/02 §2.3).

# `input`

```elixir
@type input() :: %{
  key: term(),
  delivery: Macaw.Data.Delivery.t(),
  schema: Macaw.Data.Schema.t()
}
```

An input as the owner gathered it: its key, its delivery and its schema.

# `new`

```elixir
@spec new([input()], (term() -&gt; term()), (term() -&gt; term())) :: map()
```

The context of the inputs: `key` gives an input's key as the first argument keys it
(its string by default), `value` a value as the function reads it (as given by default).

# `schema`

```elixir
@spec schema(Macaw.Data.Schema.t(), (term() -&gt; term())) :: map()
```

A schema as data, as a term: each field's name its string, each description's keys
their strings, a value entry a map of its keys' strings, and every value read through
`value`.

---

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