# `Monty.Frameworks.Models.MotorSystemState`
[🔗](https://github.com/d-led/ex.tbp.monty/blob/v0.1.0/packages/ex_tbp_monty_core/lib/monty/frameworks/models/motor_system_state.ex#L1)

Where the body is: the motor system's view of the agents it moves.

Mirrors `tbp/monty/frameworks/models/motor_system_state.py`, which holds four
names:

  * `...MotorSystemState.SensorState` and `...MotorSystemState.AgentState` —
    **ported**: one sensor's place and turn, and one agent's place, turn and
    sensors;
  * `...MotorSystemState.ProprioceptiveState` — **ported**: what the
    environment reports, a map of agent id to `AgentState`;
  * `...MotorSystemState` (this module) — **ported**: what the motor system
    works with, which Monty describes as the proprioceptive state "as well as
    any state that the motor system needs for operation".

The last two are separate classes in Monty because they are separate *ideas*,
but both are plain dictionaries with no behaviour, so `t/0` here is the same
shape as `ProprioceptiveState.t/0` until the motor system has state of its
own to add. A caller that means "what the environment said" should still say
so, because that is where the distinction will have to be made.

# `agent_id`

```elixir
@type agent_id() :: atom() | String.t()
```

# `t`

```elixir
@type t() :: %{
  optional(agent_id()) =&gt;
    Monty.Frameworks.Models.MotorSystemState.AgentState.t()
}
```

---

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