# Helpers
Dialup.Page が提供するヘルパー関数。
## 概要
`Map.merge/2` のラッパー関数。assignsを第一引数に取ることで、パイプライン操作に最適化されている。
```elixir
use Dialup.Page # で自動的に import される
```
## overwrite/2
assignsを上書き。既存のキーは新しい値で上書きされる。
```elixir
overwrite(assigns, overwrite_map)
```
### 使用例
パイプラインで連結:
```elixir
def mount(params, assigns) do
id = params["id"]
user = Users.get!(id)
{:ok, assigns
|> overwrite(%{user_id: id}) # assignsを第一引数に取る
|> overwrite(%{user: user})} # パイプラインで連結可能
end
```
### 動作
```elixir
base = %{count: 0, user_id: "old"}
base |> overwrite(%{user_id: "123"})
# => %{count: 0, user_id: "123"}
```
## set_default/2
デフォルト値を設定。既存のキーは上書きしない。
```elixir
set_default(assigns, defaults_map)
```
### 使用例
```elixir
def mount(_params, assigns) do
{:ok, assigns
|> set_default(%{count: 0}) # 未設定の場合のみ設定
|> set_default(%{loaded: false})}
end
```
### 動作
```elixir
base = %{count: 5}
base |> set_default(%{count: 0, loaded: false})
# => %{count: 5, loaded: false}
```
## 使い分け
| 関数 | 既存キー | 用途 |
|-----|---------|------|
| `overwrite/2` | 上書き | 新しいデータで状態を更新 |
| `set_default/2` | 保持 | 初期値の設定(初回のみ) |
## パイプラインでの併用例
```elixir
def mount(params, assigns) do
# 1. デフォルト値を設定(初回のみ有効)
# 2. URLパラメータに応じて上書き
{:ok, assigns
|> set_default(%{count: 0, errors: []})
|> overwrite(%{user_id: params["id"], loaded: true})}
end
```
```elixir
def handle_event("add_error", %{"msg" => msg}, assigns) do
errors = [msg | assigns.errors]
{:update, assigns |> overwrite(%{errors: errors})}
end
def handle_event("clear", _value, assigns) do
{:update, assigns |> overwrite(%{errors: [], input: ""})}
end
```
## 標準ライブラリとの比較
### 同等の書き方
```elixir
# overwrite
assigns |> Map.merge(%{count: 1})
# set_default
%{count: 0} |> Map.merge(assigns)
```
ヘルパー関数は意図を明確にし、一貫したパイプラインスタイルを保つためのもの。
## 制限
- ネストしたマップのマージは行わない(浅いマージのみ)
- リストの操作は別途行う必要がある