El módulo Agent facilita una abstracción para lanzar procesos y el bucle de recepción y envío. A partir de aquí, llamaremos procesos de agente a los procesos iniciados con el módulo Agent. Un proceso de agente podría elegirse para representar un estado compartido central.
Para iniciar un proceso de agente, Agent proporciona la función start/2. La función proporcionada al llamar a start para iniciar el proceso de agente 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 proporciona muchas funciones para trabajar con procesos de agente.
Es habitual organizar y encapsular toda la funcionalidad relacionada con Agent en un módulo para el dominio que se está modelando.
Tu asociación vecinal te ha pedido que implementes una sencilla aplicación de registro para gestionar las inscripciones del huerto comunitario. La estructura Plot ya se te ha proporcionado.
Implementa la función CommunityGarden.start/1; debe recibir una lista de palabras clave opcional con opciones que se pasarán al proceso agente. El estado inicial del huerto debe inicializarse de forma que represente una colección vacía de parcelas. Debe devolver una tupla :ok con el pid del huerto.
{:ok, pid} = CommunityGarden.start()
# => {:ok, #PID<0.112.0>}
Implementa la función CommunityGarden.list_registrations/1. Debe recibir el pid del huerto comunitario. Debe devolver una lista de las parcelas almacenadas que estén registradas.
CommunityGarden.list_registrations(pid)
# => []
En este punto, todavía no hemos añadido la posibilidad de registrar una parcela, así que esta lista debería estar vacía
Implementa la función CommunityGarden.register/2. Debe recibir el pid del huerto comunitario y un nombre con el que registrar la parcela. Cuando se realice correctamente, debe devolver la estructura Plot con el id de la parcela y la persona a la que está registrada.
Los id deben ser incrementales y únicos. Puedes mantener un contador de id 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"}]
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 se realiza correctamente. Cuando se libera una parcela, el id no se reutiliza; se usa únicamente como identificador único.
CommunityGarden.release(pid, 1)
# => :ok
CommunityGarden.list_registrations(pid)
# => []
Implementa la función CommunityGarden.get_registration/2. Debe recibir el pid y el id de la parcela que se va a comprobar. Debe devolver la parcela si está registrada, y :not_found si no lo está.
CommunityGarden.get_registration(pid, 1)
# => %Plot{plot_id: 1, registered_to: "Emma Balan"}
CommunityGarden.get_registration(pid, 7)
# => {:not_found, "plot is unregistered"}
Regístrate en Exercism para aprender y dominar Elixir con 58 conceptos168 ejercicios y mentoría humana real, todo gratis.