Модуль 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 вже надано.
Реалізуйте функцію CommunityGarden.start/1. Вона повинна приймати необовʼязковий список ключових слів з опціями, які передаються далі процесу-агенту. Початковий стан саду потрібно ініціалізувати як порожню колекцію ділянок. Функція повинна повертати кортеж :ok з pid саду.
{:ok, pid} = CommunityGarden.start()
# => {:ok, #PID<0.112.0>}
Реалізуйте функцію CommunityGarden.list_registrations/1. Вона повинна приймати pid спільного саду. Функція повинна повертати список збережених ділянок, які зареєстровано.
CommunityGarden.list_registrations(pid)
# => []
На цьому етапі ми ще не додали можливості реєструвати ділянки, тож цей список має бути порожнім
Реалізуйте функцію 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"}]
Реалізуйте функцію CommunityGarden.release/2. Вона повинна приймати pid та id ділянки, яку потрібно звільнити. У разі успіху вона повинна повертати :ok. Коли ділянку звільнено, її ідентифікатор не використовують повторно: він слугує лише унікальним ідентифікатором.
CommunityGarden.release(pid, 1)
# => :ok
CommunityGarden.list_registrations(pid)
# => []
Реалізуйте функцію 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"}
Зареєструйтеся на Exercism, щоб вивчати й опановувати Elixir, а також 58 концепцій168 вправ та справжнє наставництво від людей, і все це безкоштовно.