Percursos
/
Elixir
Elixir
/
Exercícios
/
Jardim comunitário
Jardim comunitário

Jardim comunitário

Exercício de aprendizagem

Introdução

Agent

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.

Instruções

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.

1. Abre o jardim

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>}

2. Lista os registos

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

3. Regista canteiros a uma pessoa

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"}]

4. Liberta canteiros

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)
# => []

5. Obtém um canteiro registado

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"}
Editar via GitHub A ligação abre numa nova janela ou separador
Elixir Exercism

Estás pronto para começar Jardim comunitário?

Inscreve-te no Exercism para aprenderes e dominares Elixir com 58 conceitos168 exercícios, e mentoria humana real, tudo grátis.