Current section

Files

Jump to
agente lib agente.ex
Raw

lib/agente.ex

defmodule Agente do
use Agent
@moduledoc """
Implementação de funções manipuladoras de estado utilizando o módulo Agent.
"""
@doc """
Iniciar aplicação.
"""
def start_link(initial_value) do
Agent.start_link(fn -> %{cursor: initial_value} end, name: __MODULE__)
end
@doc """
Iniciar aplicação.
"""
def start(initial_value, args) do
Agent.start_link(fn -> %{cursor: initial_value} end, name: __MODULE__)
end
@doc """
Retorna o(s) valor(es) atual(ais) armazenados.
## Exemplo:
```
iex> Agente.value()
%{cursor: :normal}
```
"""
def value(key \\ :cursor) do
Agent.get(__MODULE__, & &1)
end
@doc """
Insere o valor fornecido na chave no mapa.
## Exemplo:
```
iex> Agente.update(:cursor, "novo cursor")
:ok
```
"""
def update(key, value) do
Agent.update(__MODULE__, & Map.put(&1, key, value))
end
@doc """
Insere o valor fornecido na chave, a menos que a chave de entrada já exista no mapa.
## Exemplo:
```
iex> Agente.new(:novo, "novo valor")
:ok
```
"""
def new(key, value) do
Agent.update(__MODULE__, & Map.put_new(&1, key, value))
end
@doc """
Mescla dois mapas em um.
Todas as chaves em map2 serão adicionadas a map1, substituindo qualquer uma existente
(ou seja, as chaves em map2 "têm precedência" sobre as de map1).
## Exemplo:
```
iex> map = %{nome: "John Doe", last_name: "Smith", skills: [1, 2, 6]}
iex> Agente.merge(map)
%{cursor: :normal, last_name: "Smith", nome: "John Doe", skills: [1, 2, 6]}
```
"""
def merge(value) when is_map(value) do
Agent.update(__MODULE__, & Map.merge(&1, value))
end
@doc """
Exclui a entrada no mapa para uma chave específica.
Se a chave não existir, retorna o mapa inalterado.
## Exemplo:
```
%{cursor: "novo cursor", new: "outro valor"}
iex> Agente.delete(:new)
%{cursor: "novo cursor"}
```
"""
def delete(key) do
Agent.update(__MODULE__, & Map.delete(&1, key))
end
@doc """
Exclui as chaves fornecidas do mapa.
Se as chaves contêm chaves que não estão no mapa, elas são simplesmente ignoradas.
## Exemplo:
```
%{cursor: "novo cursor", foo: "foo bar", other: "other"}
iex> Agente.drop([:foo, :other])
%{cursor: "novo cursor"}
```
"""
def drop(keys) do
Agent.update(__MODULE__, & Map.drop(&1, keys))
end
end