وقت سیریز اور مزید کے لیے ویلا → اسمارٹ کیش

فنٹیک میں، ہمیں اکثر کرنسی ایکسچینج ریٹ ڈیٹا کی کافی بڑی مقدار پر کارروائی کرنی پڑتی ہے۔ ہمیں مختلف ذرائع سے ڈیٹا ملتا ہے، اور ان میں سے ہر ایک کا اپنا خیال ہے کہ کل، پرسوں، اگلے مہینے اور یہاں تک کہ اگلے تین سالوں کے لیے شرح مبادلہ کو کیسے بڑھایا جائے۔ اگر صرف کوئی نرخوں کی پیش گوئی کرسکتا ہے۔ صحیح طریقے سے، یہ کاروبار بند کرنے اور صرف حماقت سے پیسے آگے پیچھے کرنے کا وقت ہوگا۔ کچھ ذرائع زیادہ قابل بھروسہ ہیں، کچھ مکمل ردی کی ٹوکری کی فراہمی کرتے ہیں، تقریباً درست اقدار کے نایاب شمولیت کے ساتھ، لیکن غیر ملکی جوڑوں کے لیے۔ ہمارا کام ان دسیوں ہزار اقدار کو فی سیکنڈ میں چھاننا اور یہ طے کرنا ہے کہ صارفین کو بالکل کیا دکھانا ہے۔ ہمیں ٹن گندگی اور گاد سے ایک صحیح قدر کو فلٹر کرنے کی ضرورت ہے، بالکل اسی طرح جیسے فلیمنگو دوپہر کے کھانے میں کرتے ہیں۔

وقت سیریز اور مزید کے لیے ویلا → اسمارٹ کیش

فلیمنگو کی ایک خاص امتیازی خصوصیت ان کی نیچے کی طرف مڑے ہوئے چونچ ہیں، جس سے وہ پانی یا کیچڑ سے خوراک کو چھانتے ہیں۔
 - وکی

اس طرح لائبریری کا جنم ہوا۔ 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، باب دیکھیں موازنہ نیچے

اگر توثیق کامیاب ہو جاتی ہے، تو قیمت کو متعلقہ کلید کے تحت فہرست میں شامل کر دیا جاتا ہے؛ بصورت دیگر، ٹیپل {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

نیا تبصرہ شامل کریں