Vela β†’Β ΡƒΠΌΠ½Ρ‹ΠΉ кСш для time series ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ

Π’ Ρ„ΠΈΠ½Ρ‚Π΅Ρ…Π΅ Π½Π°ΠΌ часто приходится ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ довольно массивныС ΠΎΠ±ΡŠΠ΅ΠΌΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… курсов ΠΎΠ±ΠΌΠ΅Π½Π° Π²Π°Π»ΡŽΡ‚. ΠœΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Ρ€Π°Π·Π½Ρ‹Ρ… источников, ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… ΠΈΠΌΠ΅Π΅Ρ‚ собствСнноС прСдставлСниС ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΡΠΊΡΡ‚Ρ€Π°ΠΏΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ значСния курсов Π½Π° Π·Π°Π²Ρ‚Ρ€Π°, послСзавтра, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ мСсяц ΠΈ Π΄Π°ΠΆΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Ρ€ΠΈ Π³ΠΎΠ΄Π°. Если Π±Ρ‹ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ ΡƒΠΌΠ΅Π» ΠΏΡ€Π΅Π΄ΡΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ курсы ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Π²ΠΏΠΎΡ€Ρƒ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π·Π°ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ бизнСс ΠΈ просто Ρ‚ΡƒΠΏΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ дСньги Ρ‚ΡƒΠ΄Π°-сюда. НСкоторыС источники ΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ бо́льшим Π΄ΠΎΠ²Π΅Ρ€ΠΈΠ΅ΠΌ, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ сплошь мусор, с Ρ€Π΅Π΄ΠΊΠΈΠΌΠΈ вкраплСниями ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π½ΠΎ Π·Π°Ρ‚ΠΎ для экзотичСских ΠΏΠ°Ρ€. Наша Ρ€Π°Π±ΠΎΡ‚Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡΠ΅ΡΡ‚ΡŒ эти дСсятки тысяч Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² сСкунду ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΠ°ΠΌ. Нам Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ СдинствСнноС ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Ρ‚ΠΎΠ½Π½Ρ‹ грязи ΠΈ ΠΈΠ»Π°, ΠΊΠ°ΠΊ это Π΄Π΅Π»Π°ΡŽΡ‚ Ρ„Π»Π°ΠΌΠΈΠ½Π³ΠΎ Π½Π° ΠΎΠ±Π΅Π΄Π΅.

Vela → ΡƒΠΌΠ½Ρ‹ΠΉ кСш для time series ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ

ΠžΡΠΎΠ±Ρ‹ΠΌ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠΌ Ρ„Π»Π°ΠΌΠΈΠ½Π³ΠΎ являСтся массивный Π²Ρ‹Π³Π½ΡƒΡ‚Ρ‹ΠΉ Π²Π½ΠΈΠ· клюв, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½ΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΡŽΡ‚ ΠΏΠΈΡ‰Ρƒ ΠΈΠ· Π²ΠΎΠ΄Ρ‹ ΠΈΠ»ΠΈ ΠΈΠ»Π°.
Β β€”Β Π’ΠΈΠΊΠΈ

Π’Π°ΠΊ Ρ€ΠΎΠ΄ΠΈΠ»Π°ΡΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° 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, and Kernel.get_and_update_in/3.

Валидация

Π’Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΊΠ°ΠΊ:

  • внСшняя функция с ΠΎΠ΄Π½ΠΈΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ (&MyMod.my_fun/1), ΠΎΠ½Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ;
  • внСшняя функция с двумя Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ, &MyMod.my_fun/2, ΠΎΠ½Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ ΠΏΠ°Ρ€Ρƒ serie, value для Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ;
  • ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Vela.Validator;
  • ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ threshold, ΠΈΒ β€” ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΒ β€” compare_by, см. Π³Π»Π°Π²ΠΊΡƒ Comparison Π½ΠΈΠΆΠ΅.

Если валидация ΠΏΡ€ΠΎΡˆΠ»Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ добавляСтся Π² список ΠΏΠΎΠ΄ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ, Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ случаС ΠΊΠΎΡ€Ρ‚Π΅ΠΆ {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, Π° ΠΊΠΎΠ³Π΄Π° трСбуСтся нСбольшая история ΠΏΠΎ курсу (вСсь ряд Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ), ΠΌΡ‹ просто Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π΅Π³ΠΎΒ β€” ΡƒΠΆΠ΅ отсортированным — с ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ значСниями.

Π£Π΄Π°Ρ‡Π½ΠΎΠ³ΠΎ ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рядов!

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com