O módulo Agent proporciona uma abstração para criar processos e o ciclo receive-send. A partir daqui, chamamos processos agente aos processos iniciados com o módulo Agent. Um processo agente pode ser escolhido para representar um estado partilhado central.
Para iniciar um processo agente, o Agent fornece a função start/2. A função que forneces ao fazer start do processo agente devolve o estado inicial do processo:
# Start an agent process with an initial value of an empty list
{:ok, agent_pid} = Agent.start(fn -> [] end)
Tal como o Map ou a List, o Agent fornece muitas funções para trabalhar com processos agente.
É habitual organizar e encapsular toda a funcionalidade relacionada com o Agent num módulo para o domínio que estás a modelar.
A tua associação comunitária pediu-te para implementares uma aplicação simples de registo para gerir as inscrições no jardim comunitário. A struct Plot já te foi fornecida.
Implementa a função CommunityGarden.start/1. Esta deve receber uma lista de opções opcional (keyword list) para passar ao processo agent. O estado inicial do jardim deve ser inicializado de modo a representar uma coleção vazia de canteiros. Deve devolver um tuplo :ok com o pid do jardim.
{:ok, pid} = CommunityGarden.start()
# => {:ok, #PID<0.112.0>}
Implementa a função CommunityGarden.list_registrations/1. Esta deve receber o pid do jardim comunitário. Deve devolver uma lista dos canteiros guardados que estão registados.
CommunityGarden.list_registrations(pid)
# => []
Neste momento, ainda não adicionámos a possibilidade de registar um canteiro, por isso esta lista deve estar vazia
Implementa a função CommunityGarden.register/2. Esta deve receber o pid do jardim comunitário e um nome para registar o canteiro. Quando for bem-sucedida, deve devolver a struct Plot com o id do canteiro e a pessoa a quem este foi registado.
Os ids devem ser incrementais e únicos. Podes manter um contador de ids no estado do agent.
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"}]
Implementa a função CommunityGarden.release/2. Esta deve receber o pid e o id do canteiro a libertar. Deve devolver :ok em caso de sucesso. Quando um canteiro é libertado, o id não é reutilizado, serve apenas como identificador único.
CommunityGarden.release(pid, 1)
# => :ok
CommunityGarden.list_registrations(pid)
# => []
Implementa a função CommunityGarden.get_registration/2. Esta deve receber o pid e o id do canteiro a verificar. Deve devolver o canteiro se este estiver registado, e :not_found se não estiver registado.
CommunityGarden.get_registration(pid, 1)
# => %Plot{plot_id: 1, registered_to: "Emma Balan"}
CommunityGarden.get_registration(pid, 7)
# => {:not_found, "plot is unregistered"}
Inscreve-te no Exercism para aprenderes e dominares Elixir com 58 conceitos168 exercícios, e mentoria humana real, tudo grátis.