شکل خاص with راهی فراهم میکند تا روی «مسیر موفق» مجموعهای از گامهای بالقوه ناموفق تمرکز کنید و بعداً به شکستها رسیدگی کنید.
with {:ok, id} <- get_id(username),
{:ok, avatar} <- fetch_avatar(id),
{:ok, image_type} <- check_valid_image_type(avatar) do
{:ok, image_type, avatar}
else
:not_found ->
{:error, "invalid username"}
{:error, "not an image"} ->
{:error, "avatar associated to #{username} is not an image"}
err ->
err
end
در هر گام، اگر بندی مطابقت کند، زنجیره ادامه مییابد تا اینکه بلوک do اجرا شود. اگر یک مطابقت شکست بخورد، زنجیره متوقف میشود و بند نامطابق برگردانده میشود. این امکان را دارید که از یک بلوک else استفاده کنید تا مطابقتهای ناموفق را بگیرید و مقدار بازگشتی را تغییر دهید.
گذرنامهتان دارد منقضی میشود، پس باید سری به ادارهی شهر بزنید و آن را تمدید کنید. از تجربهی قبلی میدانید که ادارهی شهرتان لزوماً آسانترین جایی نیست که با آن سر و کار داشته باشید، بنابراین تصمیم میگیرید نهایت تلاشتان را بکنید تا همیشه روی «مسیر خوشبینانه» تمرکز کنید.
فرمی را که برای گرفتن گذرنامهی جدیدتان لازم دارید چاپ میکنید، تکمیلش میکنید، سوار ماشینتان میشوید، دور بلوک میچرخید، پارک میکنید و به سمت اداره راه میافتید.
همهی کارهای زیر نیازمند پیادهسازی و گسترش get_new_passport/3 خواهند بود.
معلوم میشود که ساختمان فقط بعدازظهرها باز است و هر روز هم سر ساعت یکسانی نیست.
تابع enter_building/1 را با زمان کنونی (که بهعنوان آرگومان اول get_new_passport/3 در اختیارتان قرار میگیرد) فراخوانی کنید. اگر ساختمان باز باشد، تابع تاپلی برمیگرداند که شامل :ok و یک برچسب زمانی است و بعداً به آن نیاز پیدا میکنید؛ در غیر این صورت تاپلی با :error و یک پیام برمیگرداند. فعلاً مسیر خوشبینانه میتواند همان تاپل :ok را برگرداند.
اگر تاپلی با :error گرفتید، از بلوک else برای برگرداندن آن استفاده کنید.
میز اطلاعات به خاطر استراحتهای قهوهی طولانی بدنام است. اگر آنقدر خوششانس باشید که کسی را آنجا پیدا کنید، دفترچهی راهنمایی به شما میدهد که توضیح میدهد بسته به تاریخ تولدتان باید به کدام باجه بروید.
تابع find_counter_information/1 را با زمان کنونی فراخوانی کنید. یا تاپلی میگیرید که شامل :ok و یک راهنماست که با یک «تابع بینام» نمایش داده میشود، یا تاپلی با :coffee_break و دستورهای بیشتر. در مسیر خوشبینانهتان که راهنما را میگیرید، آن را روی تاریخ تولدتان (آرگومان دوم get_new_passport/3) اعمال کنید. شمارهی باجهای را که باید به آن بروید برمیگرداند. تاپلی با :ok و همان شمارهی باجه را برگردانید.
اگر پیام :coffee_break گرفتید، تاپلی با :retry و یک NaiveDateTime برگردانید که به ۱۵ دقیقه بعد از زمان کنونی اشاره میکند. مثل قبل، اگر تاپلی با :error گرفتید، آن را برگردانید.
به دلایلی نامعلوم، باجههای مختلف فرمهایی با رنگهای مختلف میخواهند. طبیعتاً اولین فرمی را که در وبسایت پیدا کردید چاپ کردهاید، پس تمرکزتان را روی مسیر خوشبینانهتان میگذارید و به بهترین نتیجه امیدوارید.
تابع stamp_form/3 را با برچسب زمانیای که هنگام ورود گرفتید، باجه و فرمی که آوردهاید (آخرین آرگومان get_new_passport/3) فراخوانی کنید. یا تاپلی با :ok و یک چکسام میگیرید که برای تأیید شمارهی گذرنامهتان استفاده میشود، یا تاپلی با :error و یک پیام. بگذارید مسیر خوشبینانهتان تاپلی با :ok و همان چکسام را برگرداند. اگر تاپلی با :error گرفتید، آن را برگردانید.
بالاخره همهی مدارکی را که لازم دارید در دست دارید.
تابع get_new_passport_number/3 را با برچسب زمانی، باجه و چکسامی که قبلاً گرفتید فراخوانی کنید. رشتهای دریافت میکنید که شمارهی نهایی گذرنامهتان است؛ تنها کاری که باقی میماند این است که آن رشته را در تاپلی با :ok برگردانید و به خانه بروید.