Vela โ†’ ืžื˜ืžื•ืŸ ื—ื›ื ืœืกื“ืจื•ืช ื–ืžืŸ ื•ืขื•ื“

ื‘ืคื™ื ื˜ืง, ืœืขืชื™ื ืงืจื•ื‘ื•ืช ืื ื• ืฆืจื™ื›ื™ื ืœืขื‘ื“ ื›ืžื•ื™ื•ืช ื“ื™ ืžืกื™ื‘ื™ื•ืช ืฉืœ ื ืชื•ื ื™ ืฉืขืจ ื—ืœื™ืคื™ืŸ. ืื ื• ืžืงื‘ืœื™ื ื ืชื•ื ื™ื ืžืžืงื•ืจื•ืช ืฉื•ื ื™ื, ื•ืœื›ืœ ืื—ื“ ืžื”ื ื™ืฉ ืจืขื™ื•ืŸ ืžืฉืœื• ื›ื™ืฆื“ ืœื‘ืฆืข ืืงืกื˜ืจืคื•ืœืฆื™ื” ืฉืœ ืฉืขืจื™ ื—ืœื™ืคื™ืŸ ืœืžื—ืจ, ืžื—ืจืชื™ื™ื, ืœื—ื•ื“ืฉ ื”ื‘ื ื•ืืคื™ืœื• ืœืฉืœื•ืฉ ื”ืฉื ื™ื ื”ื‘ืื•ืช. ืื ืจืง ืžื™ืฉื”ื• ื”ื™ื” ื™ื›ื•ืœ ืœื—ื–ื•ืช ืฉื™ืขื•ืจื™ื ื ื›ื•ืŸ, ื–ื” ื™ื”ื™ื” ื”ื–ืžืŸ ืœืกื’ื•ืจ ืืช ื”ืขืกืง ื•ืคืฉื•ื˜ ืœื”ื—ืœื™ืฃ ื›ืกืฃ ื”ืœื•ืš ื•ืฉื•ื‘ ื‘ื˜ื™ืคืฉื•ืช. ื—ืœืง ืžื”ืžืงื•ืจื•ืช ืืžื™ื ื™ื ื™ื•ืชืจ, ื—ืœืง ืžืกืคืงื™ื ื–ื‘ืœ ืžืœื, ืขื ื”ื›ืœืœื•ืช ื ื“ื™ืจื•ืช ืฉืœ ืขืจื›ื™ื ื›ืžืขื˜ ื ื›ื•ื ื™ื, ืื‘ืœ ืœื–ื•ื’ื•ืช ืืงื–ื•ื˜ื™ื™ื. ื”ืชืคืงื™ื“ ืฉืœื ื• ื”ื•ื ืœื ืคื•ืช ื‘ื™ืŸ ืขืฉืจื•ืช ืืœืคื™ ื”ืขืจื›ื™ื ื”ืœืœื• ื‘ืฉื ื™ื™ื” ื•ืœืงื‘ื•ืข ืžื” ื‘ื“ื™ื•ืง ืœื”ืจืื•ืช ืœืœืงื•ื—ื•ืช. ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœืกื ืŸ ืืช ื”ืขืจืš ื”ื ื›ื•ืŸ ืื—ื“ ืžื˜ื•ื ื•ืช ืฉืœ ืœื›ืœื•ืš ื•ืกื—ืฃ, ื‘ื“ื™ื•ืง ื›ืžื• ืฉืคืœืžื™ื ื’ื• ืขื•ืฉื™ื ื‘ืฆื”ืจื™ื™ื.

Vela โ†’ ืžื˜ืžื•ืŸ ื—ื›ื ืœืกื“ืจื•ืช ื–ืžืŸ ื•ืขื•ื“

ืžืืคื™ื™ืŸ ืžื™ื•ื—ื“ ืฉืœ ืคืœืžื™ื ื’ื• ื”ื•ื ืžืงื•ืจื ื”ืžืืกื™ื‘ื™ ื”ืžืชืขืงืœ ื›ืœืคื™ ืžื˜ื”, ืฉื‘ืขื–ืจืชื• ื”ื ืžืกื ื ื™ื ืžื–ื•ืŸ ืžืžื™ื ืื• ื‘ื•ืฅ.
 - ื•ื™ืงื™

ื›ืš ื ื•ืœื“ื” ื”ืกืคืจื™ื™ื” Vela, ื”ืžืื—ืกืŸ ืžื˜ืžื•ืŸ ืžืฆื‘ ืขื‘ื•ืจ ืžืกืคืจ ืขืจื›ื™ื ื‘ืžืจื•ื•ื—ื™ ื–ืžืŸ ืžื•ื’ื“ืจื™ื. ืžืชื—ืช ืœืžื›ืกื” ื”ืžื ื•ืข, ื”ื•ื ืžืกื ืŸ ื ืชื•ื ื™ื ืจืขื™ื ื•ืžื™ื•ืฉื ื™ื ืชื•ืš ื›ื“ื™ ืชื ื•ืขื”, ื•ื’ื ืžืกืคืง ื’ื™ืฉื” ืœืขื“ื•ื ื™ื ื”ืื—ืจื•ื ื™ื N ืขืจื›ื™ื ืžืื•ืžืชื™ื ืขื‘ื•ืจ ื›ืœ ืžืคืชื— (ืฆืžื“ื™ ืžื˜ื‘ืขื•ืช, ื‘ืžืงืจื” ืฉืœื ื•).

ื ื ื™ื— ืฉืื ื• ืื•ืกืคื™ื ืชืขืจื™ืคื™ื ืขื‘ื•ืจ ืฉืœื•ืฉื” ืฆืžื“ื™ ืžื˜ื‘ืขื•ืช. ื”ื”ื’ื“ืจื” ื”ืคืฉื•ื˜ื” ื‘ื™ื•ืชืจ Vela ื›ื“ื™ ืœืื—ืกืŸ ืืช ื”ืžืฆื‘ ื”ื ื•ื›ื—ื™ ื–ื” ื™ื™ืจืื” ื‘ืขืจืš ื›ืš:

defmodule Pairs do
  use Vela,
    eurusd: [sorter: &Kernel.<=/2],
    eurgbp: [limit: 3, errors: 1],
    eurcad: [validator: Pairs]

  @behaviour Vela.Validator

  @impl Vela.Validator
  def valid?(:eurcad, rate), do: rate > 0
end

ืขื“ื›ื•ืŸ ืขืจื›ื™ื

Vela.put/3 ื”ืคื•ื ืงืฆื™ื” ืชืขืฉื” ืืช ื”ืคืขื•ืœื•ืช ื”ื‘ืื•ืช ื‘ืจืฆืฃ:

  • ื™ื’ืจื•ื validator ืขืœ ื”ืขืจืš, ืื ืžื•ื’ื“ืจ ื›ื–ื” (ืจืื” ืคืจืง ืžึทืชึทืŸ ืชื•ึนืงึตืฃ ืœึฐื”ึทืœึธืŸ);
  • ื™ื•ืกื™ืฃ ืืช ื”ืขืจืš ืœืฉื•ืจืช ื”ืขืจื›ื™ื ื”ื˜ื•ื‘ื™ื ืื ื”ืื™ืžื•ืช ื”ืฆืœื™ื—, ืื• ืœืฉื•ืจืช ื”ืฉื™ืจื•ืช :__errors__ ืื—ืจืช;
  • ื™ื’ืจื•ื ืœืžื™ื•ืŸ ืื sorter ืžื•ื’ื“ืจ ืขื‘ื•ืจ ืžืคืชื— ื ืชื•ืŸ, ืื• ืคืฉื•ื˜ ื™ื›ื ื™ืก ืืช ื”ืขืจืš ื‘ืจืืฉ ื”ืจืฉื™ืžื” (LIFO, ืจืื” ืคืจืง ะกะพั€ั‚ะธั€ะพะฒะบะฐ ืœึฐื”ึทืœึธืŸ);
  • ื™ืงืฆืฅ ืืช ื”ืฉื•ืจื” ืœืคื™ ื”ืคืจืžื˜ืจ :limit ืขื‘ืจ ืขืœ ื”ื‘ืจื™ืื”;
  • ื™ื—ื–ื™ืจ ืืช ื”ืžื‘ื ื” ื”ืžืขื•ื“ื›ืŸ Vela.

iex|1 > pairs = %Pairs{}
iex|2 > Vela.put(pairs, :eurcad, 1.0)
#โ‡’ %Pairs{..., eurcad: [1.0], ...}
iex|3 > Vela.put(pairs, :eurcad, -1.0)
#โ‡’ %Pairs{__errors__: [eurcad: -1.0], ...}
iex|4 > pairs |> Vela.put(:eurusd, 2.0) |> Vela.put(:eurusd, 1.0)
#โ‡’ %Pairs{... eurusd: [1.0, 2.0]}

ื’ื Vela ืžื™ื™ืฉื Access, ื›ืš ืฉืชื•ื›ืœ ืœื”ืฉืชืžืฉ ื‘ื›ืœ ืื—ืช ืžื”ืคื•ื ืงืฆื™ื•ืช ื”ืกื˜ื ื“ืจื˜ื™ื•ืช ืœืขื“ื›ื•ืŸ ืžื‘ื ื™ื ืขืžื•ืงื™ื ืžื”ืืจืกื ืœ ืœืขื“ื›ื•ืŸ ืขืจื›ื™ื Kernel: Kernel.get_in/2, Kernel.put_in/3, Kernel.update_in/3, Kernel.pop_in/2, ื• Kernel.get_and_update_in/3.

ืžึทืชึทืŸ ืชื•ึนืงึตืฃ

ื ื™ืชืŸ ืœื”ื’ื“ื™ืจ ืžืืžืช ื›:

  • ืคื•ื ืงืฆื™ื” ื—ื™ืฆื•ื ื™ืช ืขื ืืจื’ื•ืžื ื˜ ืื—ื“ (&MyMod.my_fun/1), ื”ื•ื ื™ืงื‘ืœ ืจืง ืืช ื”ืขืจืš ืœืื™ืžื•ืช;
  • ืคื•ื ืงืฆื™ื” ื—ื™ืฆื•ื ื™ืช ืขื ืฉื ื™ ืืจื’ื•ืžื ื˜ื™ื, &MyMod.my_fun/2, ื”ื™ื ืชืงื‘ืœ ื–ื•ื’ serie, value ืœืฆื•ืจืš ืื™ืžื•ืช;
  • ื™ื™ืฉื•ื ืžื•ื“ื•ืœ Vela.Validator;
  • ืคืจืžื˜ืจ ืชืฆื•ืจื” threshold, ื• - ืื•ืคืฆื™ื•ื ืœื™ - compare_by, ืจืื” ืคืจืง ื”ืฉื•ื•ืื” ืœึฐื”ึทืœึธืŸ.

ืื ื”ืื™ืžื•ืช ื”ืฆืœื™ื—, ื”ืขืจืš ืžืชื•ื•ืกืฃ ืœืจืฉื™ืžื” ืžืชื—ืช ืœืžืคืชื— ื”ืžืชืื™ื; ืื—ืจืช, ื”-tuple {serie, value} ื”ื•ืœืš ืœ :__errors_.

ื”ืฉื•ื•ืื”

ื”ืขืจื›ื™ื ื”ืžืื•ื—ืกื ื™ื ื‘ืฉื•ืจื•ืช ืืœื” ื™ื›ื•ืœื™ื ืœื”ื™ื•ืช ื›ืœ ื“ื‘ืจ. ืœืœืžื“ Vela ื›ื“ื™ ืœื”ืฉื•ื•ืช ื‘ื™ื ื™ื”ื, ื™ืฉ ืฆื•ืจืš ืœื”ืขื‘ื™ืจ compare_by ืคืจืžื˜ืจ ื‘ื”ื’ื“ืจืช ื”ืกื“ืจื” (ืืœื ืื ืœื ื ื™ืชืŸ ืœื”ืฉื•ื•ืช ืืช ื”ืขืจื›ื™ื ืœืชืงืŸ Kernel.</2); ืคืจืžื˜ืจ ื–ื” ื—ื™ื™ื‘ ืœื”ื™ื•ืช ืžืกื•ื’ (Vela.value() -> number()). ื›ื‘ืจื™ืจืช ืžื—ื“ืœ ื–ื” ืคืฉื•ื˜ & &1.

ื›ืžื• ื›ืŸ, ื ื™ืชืŸ ืœื”ืขื‘ื™ืจ ืคืจืžื˜ืจ ืœื”ื’ื“ืจืช ื”ืฉื•ืจื” comparator ื›ื“ื™ ืœื—ืฉื‘ ืขืจื›ื™ ื“ืœืชื (min/max); ืœืžืฉืœ, ืขืœ ื™ื“ื™ ืฉื™ื“ื•ืจ Date.diff/2 ื‘ืชื•ืจ ื”ืฉื•ื•ืื”, ืืชื” ื™ื›ื•ืœ ืœืงื‘ืœ ืืช ื”ื“ืœืชื•ืช ื”ื ื›ื•ื ื•ืช ืœืชืืจื™ื›ื™ื.

ื“ืจืš ื ื•ื—ื” ื ื•ืกืคืช ืœืขื‘ื•ื“ ื”ื™ื ืœื”ืขื‘ื™ืจ ืคืจืžื˜ืจ threshold, ื”ืžื’ื“ื™ืจ ืืช ื”ื™ื—ืก ื”ืžืจื‘ื™ ื”ืžื•ืชืจ ืฉืœ ื”ืขืจืš ื”ื—ื“ืฉ ืœ {min, max} ื”ึทืคืกึธืงึธื”. ืžื›ื™ื•ื•ืŸ ืฉื”ื•ื ืžืฆื•ื™ืŸ ื‘ืื—ื•ื–ื™ื, ื”ืฆ'ืง ืื™ื ื• ืžืฉืชืžืฉ comparatorืื‘ืœ ืขื“ื™ื™ืŸ ืžืฉืชืžืฉ compare_by. ืœื“ื•ื’ืžื”, ื›ื“ื™ ืœืฆื™ื™ืŸ ืขืจืš ืกืฃ ืœืฉืขื•ืช ืชืืจื™ื›ื™ื, ืขืœื™ืš ืœืฆื™ื™ืŸ compare_by: &DateTime.to_unix/1 (ื›ื“ื™ ืœืงื‘ืœ ืขืจืš ืฉืœ ืžืกืคืจ ืฉืœื) ื• threshold: 1, ืžื” ืฉื’ื•ืจื ืœืขืจื›ื™ื ื—ื“ืฉื™ื ืœื”ื™ื•ืช ืžื•ืจืฉื™ื ืจืง ืื ื”ื ื ืžืฆืื™ื ยฑband ืžืจื•ื•ื— ืžื”ืขืจื›ื™ื ื”ื ื•ื›ื—ื™ื™ื.

ืœื‘ืกื•ืฃ, ืืชื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ Vela.equal?/2 ืœื”ืฉื•ื•ืช ื‘ื™ืŸ ืฉื ื™ ืžื˜ืžื•ื ื™ื. ืื ื”ืขืจื›ื™ื ืžื’ื“ื™ืจื™ื ืคื•ื ืงืฆื™ื” equal?/2 ืื• compare/2, ืื– ื”ืคื•ื ืงืฆื™ื•ืช ื”ืืœื” ื™ืฉืžืฉื• ืœื”ืฉื•ื•ืื”, ืื—ืจืช ืื ื—ื ื• ืžืฉืชืžืฉื™ื ื‘ื˜ื™ืคืฉื•ืช ==/2.

ืงื‘ืœืช ืขืจื›ื™ื

ืขื™ื‘ื•ื“ ื”ืžืฆื‘ ื”ื ื•ื›ื—ื™ ืžืชื—ื™ืœ ื‘ื“ืจืš ื›ืœืœ ื‘ื”ืชืงืฉืจื•ืช Vela.purge/1, ืืฉืจ ืžืกื™ืจ ืขืจื›ื™ื ืžื™ื•ืฉื ื™ื (ืื validator ืงืฉื•ืจ ืœ timestamps). ืœืื—ืจ ืžื›ืŸ ืชื•ื›ืœ ืœื”ืชืงืฉืจ Vela.slice/1ืืฉืจ ื™ื—ื–ื•ืจ keyword ืขื ืฉืžื•ืช ืฉื•ืจื•ืช ื›ืžืคืชื—ื•ืช ื•ื”ืขืจื›ื™ื ื”ืจืืฉื•ื ื™ื ื‘ืคื•ืขืœ.

ืืชื” ื™ื›ื•ืœ ื’ื ืœื”ืฉืชืžืฉ get_in/2/pop_in/2 ืœื’ื™ืฉื” ื‘ืจืžื” ื ืžื•ื›ื” ืœืขืจื›ื™ื ื‘ื›ืœ ืฉื•ืจื”.

ื™ื™ืฉื•ื

Vela ื™ื›ื•ืœ ืœื”ื™ื•ืช ืฉื™ืžื•ืฉื™ ื‘ื™ื•ืชืจ ื›ืžื˜ืžื•ืŸ ืฉืœ ืกื“ืจืช ื–ืžืŸ ื‘ืžืฆื‘ ืชื”ืœื™ืš ื›ืžื• GenServer/Agent. ืื ื—ื ื• ืจื•ืฆื™ื ืœืขื•ืœื ืœื ืœื”ืฉืชืžืฉ ื‘ืขืจื›ื™ ืงื•ืจืก ืžื™ื•ืฉื ื™ื, ื•ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช ืื ื—ื ื• ืคืฉื•ื˜ ืฉื•ืžืจื™ื ืขืœ ื”ืชื”ืœื™ืš ืขื ืžืฆื‘ ืžืขื•ื‘ื“ Vela, ืขื ื”ืžืืžืช ื”ืžื•ืฆื’ ืœื”ืœืŸ.

@impl Vela.Validator
def valid?(_key, %Rate{} = rate),
  do: Rate.age(rate) < @death_age

ะธ Vela.purge/1 ืžืกื™ืจ ื‘ืฉืงื˜ ืืช ื›ืœ ื”ืขืจื›ื™ื ื”ืžืขื•ืคืฉื™ื ื‘ื›ืœ ืคืขื ืฉืื ื—ื ื• ืฆืจื™ื›ื™ื ืืช ื”ื ืชื•ื ื™ื. ื›ื“ื™ ืœื’ืฉืช ืœืขืจื›ื™ื ื‘ืคื•ืขืœ ืื ื• ืคืฉื•ื˜ ืžืชืงืฉืจื™ื Vela.slice/1, ื•ื›ืฉื ื“ืจืฉืช ื”ื™ืกื˜ื•ืจื™ื” ืงื˜ื ื” ืฉืœ ื”ืงื•ืจืก (ื›ืœ ื”ืกื“ืจื”), ืื ื—ื ื• ืคืฉื•ื˜ ืžื—ื–ื™ืจื™ื ืื•ืชื” - ื›ื‘ืจ ืžืžื•ื™ื ืช - ืขื ืขืจื›ื™ื ืžืื•ืžืชื™ื.

ืื—ืกื•ืŸ ื‘ืกื“ืจื•ืช ื–ืžืŸ ืฉืžื—!

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”