# `Finitomata.Throttler`
[🔗](https://github.com/am-kantox/finitomata/blob/v0.35.0/lib/finitomata/throttler.ex#L1)

The internal definition of the call to throttle.

`Finitomata.Throttler.call/3` is a blocking call similar to `GenServer.call/3`, but
  served by the underlying `GenStage` producer-consumer pair.

Despite this implementation of throttling based on `GenStage` is provided
  mostly for internal needs, it is generic enough to use wherever. Use the childspec
  `{Finitomata.Throttler, name: name, initial: [], max_demand: 3, interval: 1_000}`
  to start a throttling process and `Finitomata.Throttler.call/3` to perform throttled
  synchronous calls from different processes.

### Usage

```elixir
{:ok, pid} = Finitomata.Throttler.start_link(name: Throttler)

Finitomata.Throttler.call(Throttler, {IO, :inspect, [42]})
42

#⇒ %Finitomata.Throttler{
#   from: {#PID<0.335.0>, #Reference<0.3154300821.2643722246.59214>},
#   fun: {IO, :inspect},
#   args: ~c"*",
#   result: 42,
#   duration: 192402,
#   payload: nil
# }  
```

# `t`

```elixir
@type t() :: %Finitomata.Throttler{
  from: GenServer.from(),
  fun: (keyword() -&gt; any()),
  args: keyword(),
  result: any(),
  duration: pos_integer(),
  payload: any()
}
```

The _in/out_ parameter for calls to `Finitomata.Throttler.call/3`

# `throttlee`

```elixir
@type throttlee() :: t() | {(keyword() -&gt; any()), [any()]}
```

The simplified _in_ parameter for calls to `Finitomata.Throttler.call/3`

# `call`

Synchronously executes the function, using throttling based on `GenStage`.

This function has a default timeout `:infinity` because of its nature
  (throttling is supposed to take a while,) but it might be passed as the third
  argument in a call to `call/3`.

If a list of functions is given, executes all of them in parallel,
  collects the results, and then returns them to the caller.

The function might be given as `t:Finitomata.Throttler.t/0` or
  in a simplified form as `{function_of_arity_1, arg}` or `{mod, fun, args}`.

# `child_spec`

Returns a specification to start this module under a supervisor.

See `Supervisor`.

# `start_link`

Starts the throttler with the underlying producer-consumer stages.

Accepted options are:

- `name` the base name for the throttler to be used in calls to `call/3`
- `initial` the initial load of requests (avoid using it unless really needed)
- `max_demand`, `initial` the options to be passed directly to `GenStage`’s consumer

---

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