เชซเชฟเชจเชเซเชเชฎเชพเช, เช เชฎเชพเชฐเซ เชฎเซเชเชพเชญเชพเชเซ เชเชฒเชฃ เชตเชฟเชจเชฟเชฎเชฏ เชฆเชฐเชจเชพ เชกเซเชเชพเชจเชพ เชฎเซเชเชพ เชชเซเชฐเชฎเชพเชฃเชฎเชพเช เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเชตเซ เชชเชกเซ เชเซ. เช เชฎเซ เชตเชฟเชตเชฟเชง เชธเซเชคเซเชฐเซเชคเซเชฎเชพเชเชฅเซ เชกเซเชเชพ เชฎเซเชณเชตเซเช เชเซเช, เช เชจเซ เชคเซเชฎเชพเชเชจเชพ เชฆเชฐเซเช เชชเชพเชธเซ เชเชตเชคเซ เชเชพเชฒ, เชเชเชฒเชพ เชฆเชฟเชตเชธเซ, เชเชตเชคเชพ เชฎเชนเชฟเชจเซ เช เชจเซ เชเชเชพเชฎเซ เชคเซเชฐเชฃ เชตเชฐเซเชท เชฎเชพเชเซ เชตเชฟเชจเชฟเชฎเชฏ เชฆเชฐเซ เชเซเชตเซ เชฐเซเชคเซ เชเชเซเชธเซเชเซเชฐเชพเชชเซเชฒเซเช เชเชฐเชตเชพ เชคเซเชจเซ เชชเซเชคเชพเชจเซ เชตเชฟเชเชพเชฐ เชเซ. เชเซ เชเซเช เชตเซเชฏเชเซเชคเชฟ เชฆเชฐเซเชจเซ เชเชเชพเชนเซ เชเชฐเซ เชถเชเซ เช เชงเชฟเชเชพเชฐ, เชคเซ เชงเชเชงเซ เชฌเชเชง เชเชฐเชตเชพเชจเซ เช เชจเซ เชฎเชพเชคเซเชฐ เชฎเซเชฐเซเชเชคเชพเชชเซเชฐเซเชตเช เชชเซเชธเชพ เชฌเชฆเชฒเชตเชพเชจเซ เชธเชฎเชฏ เชนเชถเซ. เชเซเชเชฒเชพเช เชธเซเชคเซเชฐเซเชคเซ เชตเชงเซ เชตเชฟเชถเซเชตเชธเชจเซเชฏ เชเซ, เชเซเชเชฒเชพเช เชธเชเชชเซเชฐเซเชฃ เชเชเชฐเซ เชชเซเชฐเชพ เชชเชพเชกเซ เชเซ, เชเซเชฎเชพเช เชฒเชเชญเช เชธเชพเชเชพ เชฎเซเชฒเซเชฏเซเชจเชพ เชฆเซเชฐเซเชฒเชญ เชธเชฎเชพเชตเซเชถ เชฅเชพเชฏ เชเซ, เชชเชฐเชเชคเซ เชตเชฟเชฆเซเชถเซ เชฏเซเชเชฒเซ เชฎเชพเชเซ. เช เชฎเชพเชฐเซเช เชเชพเชฐเซเชฏ เชธเซเชเชจเซเชก เชฆเซเช เช เชฆเชธ เชนเชเชพเชฐเซ เชฎเซเชฒเซเชฏเซเชจเซ เชคเชชเชพเชธเชตเชพเชจเซเช เช เชจเซ เชเซเชฐเชพเชนเชเซเชจเซ เชฌเชฐเชพเชฌเชฐ เชถเซเช เชฌเชคเชพเชตเชตเชพเชจเซเช เชเซ เชคเซ เชจเชเซเชเซ เชเชฐเชตเชพเชจเซเช เชเซ. เชเชชเชฃเซ เชเชจ เชเชเชฆเชเซ เช เชจเซ เชเชพเชเชชเชฎเชพเชเชฅเซ เชเช เชธเชพเชเซ เชเชฟเชเชฎเชค เชซเชฟเชฒเซเชเชฐ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ, เชเซเชฎ เชซเซเชฒเซเชฎเชฟเชเชเซ เชฒเชเชเชฎเชพเช เชเชฐเซ เชเซ.
เชซเซเชฒเซเชฎเชฟเชเชเซเชจเซเช เชเช เชตเชฟเชถเชฟเชทเซเช เชตเชฟเชถเชฟเชทเซเช เชฒเชเซเชทเชฃ เชคเซเชฎเชจเซ เชจเซเชเซเชจเซ เชคเชฐเชซ เชตเชณเซเชฒเซ เชเชพเชเช เชเซ, เชเซเชจเชพ เชตเชกเซ เชคเซเช เชชเชพเชฃเซ เช เชฅเชตเชพ เชเชพเชฆเชตเชฎเชพเชเชฅเซ เชเซเชฐเชพเชเชจเซ เชซเชฟเชฒเซเชเชฐ เชเชฐเซ เชเซ.
-เชตเชฟเชเซ
เชเชฎ เชชเซเชธเซเชคเชเชพเชฒเชฏเชจเซ เชเชจเซเชฎ เชฅเชฏเซ Vela
เชเชพเชฒเซ เชเชนเซเช เชเซ เช
เชฎเซ เชคเซเชฐเชฃ เชเชฒเชฃ เชเซเชกเซ เชฎเชพเชเซ เชฆเชฐเซ เชเชเชคเซเชฐเชฟเชค เชเชฐเซเช เชเซเช. เชธเซเชฅเซ เชธเชฐเชณ เชตเซเชฏเชพเชเซเชฏเชพ 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, เชชเซเชฐเชเชฐเชฃ เชเซเช เชธortเชฐเซเชเชฟเชเช เชจเซเชเซ); - เชชเชฐเชฟเชฎเชพเชฃ เช
เชจเซเชธเชพเชฐ เชชเชเชเซเชคเชฟเชจเซ เชเซเชฐเชฟเชฎ เชเชฐเชถเซ
: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
, เชชเซเชฐเชเชฐเชฃ เชเซเช เชธเชฐเชเชพเชฎเชฃเซ เชจเซเชเซ.
เชเซ เชฎเชพเชจเซเชฏเชคเชพ เชธเชซเชณ เชฅเชพเชฏ, เชคเซ เชเชฟเชเชฎเชค เช
เชจเซเชฐเซเชช เชเซ เชนเซเช เชณ เชธเซเชเชฟเชฎเชพเช เชเชฎเซเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ; เช
เชจเซเชฏเชฅเชพ, เชเซเชฏเซเชชเชฒ {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