Trilhas
/
Elixir
Elixir
/
Exercícios
/
Horta comunitária
Horta comunitária

Horta comunitária

Exercício de aprendizagem

Introdução

Agent

O módulo Agent oferece uma abstração para criar processos e o laço receive-send. Daqui em diante, vamos chamar de 'processos agente' os processos iniciados com o módulo Agent. Um processo agente pode ser escolhido para representar um estado compartilhado central.

Para iniciar um processo agente, o Agent fornece a função start/2. A função fornecida ao iniciar o processo agente com start retorna o estado inicial do processo:

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

Assim como Map ou List, o Agent fornece muitas funções para trabalhar com processos agente.

É comum organizar e encapsular toda a funcionalidade relacionada ao Agent em um módulo para o domínio que está sendo modelado.

Instruções

Sua associação comunitária pediu que você implementasse uma aplicação simples de registro para gerenciar os registros da horta comunitária. A struct Plot já foi fornecida para você.

1. Abra a horta

Implemente a função CommunityGarden.start/1. Ela deve receber uma lista opcional de opções no formato keyword list para repassar ao processo agent. O estado inicial da horta deve ser inicializado para representar uma coleção vazia de canteiros. Ela deve retornar uma tupla :ok com o pid da horta.

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

2. Liste os registros

Implemente a função CommunityGarden.list_registrations/1. Ela deve receber o pid da horta comunitária. Ela deve retornar uma lista dos canteiros armazenados que estão registrados.

CommunityGarden.list_registrations(pid)
# => []

Neste ponto, ainda não adicionamos a possibilidade de registrar um canteiro, então essa lista deve estar vazia

3. Registre canteiros para uma pessoa

Implemente a função CommunityGarden.register/2. Ela deve receber o pid da horta comunitária e um nome para registrar o canteiro. Quando der certo, ela deve retornar a struct Plot com o id do canteiro e a pessoa a quem ele foi registrado.

Os ids devem ser incrementais e únicos. Você pode manter um contador de id 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"}]

4. Libere canteiros

Implemente a função CommunityGarden.release/2. Ela deve receber o pid e o id do canteiro a ser liberado. Ela deve retornar :ok em caso de sucesso. Quando um canteiro é liberado, o id não é reutilizado, ele serve apenas como um identificador único.

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

5. Obtenha um canteiro registrado

Implemente a função CommunityGarden.get_registration/2. Ela deve receber o pid e o id do canteiro a ser verificado. Ela deve retornar o canteiro se ele estiver registrado e :not_found se não estiver registrado.

CommunityGarden.get_registration(pid, 1)
# => %Plot{plot_id: 1, registered_to: "Emma Balan"}
CommunityGarden.get_registration(pid, 7)
# => {:not_found, "plot is unregistered"}
Editar via GitHub O link abre em uma nova janela ou aba
Elixir Exercism

Tudo pronto para começar Horta comunitária?

Crie sua conta no Exercism para aprender e dominar Elixir com 58 conceitos168 exercícios e mentoria humana de verdade, tudo de graça.