Треки
/
Elixir
Elixir
/
Вправи
/
Громадський сад
Громадський сад

Громадський сад

Навчальна вправа

Вступ

Agent

Модуль Agent надає абстракцію для породження процесів та циклу receive-send. Далі процеси, запущені за допомогою модуля Agent, ми називатимемо «агентними процесами». Агентний процес можна вибрати для представлення центрального спільного стану.

Щоб запустити агентний процес, Agent надає функцію start/2. Функція, яку ми передаємо, коли викликаємо start для агентного процесу, повертає початковий стан процесу:

# Start an agent process with an initial value of an empty list
{:ok, agent_pid} = Agent.start(fn -> [] end)

Як і Map чи List, Agent надає багато функцій для роботи з агентними процесами.

Зазвичай усю функціональність, повʼязану з Agent, організовують і інкапсулюють у модуль для предметної області, яку моделюють.

Вказівки

Ваше обʼєднання сусідів попросило реалізувати простий застосунок для ведення реєстру реєстрацій на спільний сад. Структуру Plot вже надано.

1. Відкрити сад

Реалізуйте функцію CommunityGarden.start/1. Вона повинна приймати необовʼязковий список ключових слів з опціями, які передаються далі процесу-агенту. Початковий стан саду потрібно ініціалізувати як порожню колекцію ділянок. Функція повинна повертати кортеж :ok з pid саду.

{:ok, pid} = CommunityGarden.start()
# => {:ok, #PID<0.112.0>}

2. Перелічити реєстрації

Реалізуйте функцію CommunityGarden.list_registrations/1. Вона повинна приймати pid спільного саду. Функція повинна повертати список збережених ділянок, які зареєстровано.

CommunityGarden.list_registrations(pid)
# => []

На цьому етапі ми ще не додали можливості реєструвати ділянки, тож цей список має бути порожнім

3. Зареєструвати ділянки за особою

Реалізуйте функцію CommunityGarden.register/2. Вона повинна приймати pid спільного саду та імʼя, на яке потрібно зареєструвати ділянку. У разі успіху вона повинна повертати структуру Plot з ідентифікатором ділянки та особою, за якою її зареєстровано.

Ідентифікатори мають бути послідовними й унікальними. Лічильник ідентифікаторів можна зберігати у стані агента.

CommunityGarden.register(pid, "Emma Balan")
# => %Plot{plot_id: 1, registered_to: "Emma Balan"}
CommunityGarden.list_registrations(pid)
# => [%Plot{plot_id: 1, registered_to: "Emma Balan"}]

4. Звільнити ділянки

Реалізуйте функцію CommunityGarden.release/2. Вона повинна приймати pid та id ділянки, яку потрібно звільнити. У разі успіху вона повинна повертати :ok. Коли ділянку звільнено, її ідентифікатор не використовують повторно: він слугує лише унікальним ідентифікатором.

CommunityGarden.release(pid, 1)
# => :ok
CommunityGarden.list_registrations(pid)
# => []

5. Отримати зареєстровану ділянку

Реалізуйте функцію CommunityGarden.get_registration/2. Вона повинна приймати pid та id ділянки, яку потрібно перевірити. Вона повинна повертати ділянку, якщо її зареєстровано, та :not_found, якщо її не зареєстровано.

CommunityGarden.get_registration(pid, 1)
# => %Plot{plot_id: 1, registered_to: "Emma Balan"}
CommunityGarden.get_registration(pid, 7)
# => {:not_found, "plot is unregistered"}
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Elixir Exercism

Час розпочати Громадський сад?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Elixir, а також 58 концепцій168 вправ та справжнє наставництво від людей, і все це безкоштовно.