Tracks
/
Elixir
Elixir
/
Ejercicios
/
Jardín comunitario
Jardín comunitario

Jardín comunitario

Ejercicio de aprendizaje

Introducción

Agent

El módulo Agent facilita una abstracción para lanzar procesos y el bucle receive-send. De aquí en adelante, llamaremos procesos agente a los procesos iniciados con el módulo Agent. Se puede elegir un proceso agente para representar un estado compartido central.

Para iniciar un proceso agente, Agent ofrece la función start/2. La función que se proporciona al iniciar el proceso agente con start devuelve el estado inicial del proceso:

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

Al igual que Map o List, Agent ofrece muchas funciones para trabajar con procesos agente.

Es costumbre organizar y encapsular toda la funcionalidad relacionada con Agent en un módulo para el dominio que se está modelando.

Instrucciones

Tu asociación comunitaria te ha pedido que implementes una aplicación de registro sencilla para gestionar las inscripciones del jardín comunitario. El struct Plot ya se te ha proporcionado.

1. Abrir el jardín

Implementa la función CommunityGarden.start/1; debe recibir una lista de palabras clave de opciones opcional que se pasará al proceso agente. El estado inicial del jardín debe inicializarse para representar una colección vacía de parcelas. Debe devolver una tupla :ok con el pid del jardín.

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

2. Listar los registros

Implementa la función CommunityGarden.list_registrations/1. Debe recibir el pid del jardín comunitario. Debe devolver una lista de las parcelas almacenadas que están registradas.

CommunityGarden.list_registrations(pid)
# => []

En este punto, todavía no hemos agregado la capacidad de registrar una parcela, así que esta lista debería estar vacía

3. Registrar parcelas a una persona

Implementa la función CommunityGarden.register/2. Debe recibir el pid del jardín comunitario y un nombre para registrar la parcela. Cuando tiene éxito, debe devolver el struct Plot con el id de la parcela y la persona a la que está registrada.

Los ids deben ser incrementales y únicos. Puedes mantener un contador de ids en el estado del agente.

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. Liberar parcelas

Implementa la función CommunityGarden.release/2. Debe recibir el pid y el id de la parcela que se va a liberar. Debe devolver :ok si tiene éxito. Cuando se libera una parcela, el id no se reutiliza; solo se usa como identificador único.

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

5. Obtener una parcela registrada

Implementa la función CommunityGarden.get_registration/2. Debe recibir el pid y el id de la parcela que se va a consultar. Debe devolver la parcela si está registrada, y :not_found si no está registrada.

CommunityGarden.get_registration(pid, 1)
# => %Plot{plot_id: 1, registered_to: "Emma Balan"}
CommunityGarden.get_registration(pid, 7)
# => {:not_found, "plot is unregistered"}
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Elixir Exercism

¿Todo listo para empezar Jardín comunitario?

Regístrate en Exercism para aprender y dominar Elixir con 58 conceptos168 ejercicios y mentoría humana real, todo gratis.