Enum.slide/3を楽しむ（Elixir）

**あふことの絶えてしなくばなかなかに人をも身をも恨みざらまし**

Advent Calendar 2022 96日目[^1]の記事です。
I'm looking forward to 12/25,2022 :santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5:
私の[Advent Calendar 2022 一覧](https://docs.google.com/spreadsheets/d/1HQvFjagQLRPjOYAjDVzWp9S4b8dKixxvvaz_TtbZWto/edit#gid=1723448955)。

[^1]: @kaizen_nagoya さんの「[「@e99h2121 アドベントカレンダーではありますまいか Advent Calendar 2020」の改訂版ではありますまいか Advent Calendar 2022 １日目　Most Breakthrough Generator](https://qiita.com/kaizen_nagoya/items/49ebebee3a0377f3b59b)」から着想を得て、模倣いたしました。 

---



# はじめに

[Elixir](https://elixir-lang.org/)を楽しんでいますか:bangbang::bangbang::bangbang:

今日は[Enum.slide/3](https://hexdocs.pm/elixir/Enum.html#slide/3)について書きます。

# [Enum.slide/3](https://hexdocs.pm/elixir/Enum.html#slide/3)

[Elixir](https://elixir-lang.org/) 1.13 or laterです。

公式の説明をそのまま載せます。

![スクリーンショット 2022-04-12 22.41.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/2a74446e-c415-6928-8005-26f88ba37f5e.png)

ざっくり言うとスライドさせる関数です。
私には難解でした。

## Examples

例はひとつひとつ説明してみます。
リストは0オリジン(はじまり)です。


```elixir
iex> Enum.slide([:a, :b, :c, :d, :e, :f, :g], 5, 1)
[:a, :f, :b, :c, :d, :e, :g]
```

indexが5の要素つまり`:f`をindex 1にいれます。
残りはスライドさせます。
うん、わかったね。
次行こう！　次！



```elixir
# Slide a range of elements backward
iex> Enum.slide([:a, :b, :c, :d, :e, :f, :g], 3..5, 1)
[:a, :d, :e, :f, :b, :c, :g]
```

今度はRangeで指定です。
indexが3から5の要素つまり、`[:d, :e, :f]`をindex 1の位置にずらしています。


```elixir
# Slide a range of elements forward
iex> Enum.slide([:a, :b, :c, :d, :e, :f, :g], 1..3, 5)
[:a, :e, :f, :b, :c, :d, :g]
```

今度もRangeの指定です。
indexが1から3の要素つまり、`[:b, :c, :d]`をindex 5の位置にずらしています。



```elixir
# Slide with negative indices (counting from the end)
iex> Enum.slide([:a, :b, :c, :d, :e, :f, :g], 3..-1//1, 2)
[:a, :b, :d, :e, :f, :g, :c]
```

今度もRangeの指定です。
indexが3から末尾の要素つまり、`[:d, :e, :f, :g]`をindex 2の位置にずらしています。


```elixir
iex> Enum.slide([:a, :b, :c, :d, :e, :f, :g], -4..-2, 1)
[:a, :d, :e, :f, :b, :c, :g]
```

今度もRangeの指定です。
indexが末尾が-1ですから`-4..-2`ってのはつまり`[:d, :e, :f]`ををindex 1の位置にずらしています。

```elixir
# Insert at negative indices (counting from the end)
iex> Enum.slide([:a, :b, :c, :d, :e, :f, :g], 3, -1)
[:a, :b, :c, :e, :f, :g, :d]
```

indexが3の要素つまり`:d`を末尾にずらしています。

改めて[Enum.slide/3](https://hexdocs.pm/elixir/Enum.html#slide/3)の各引数の意味は以下の通りです。

- 第1引数は、enumerable
- 第2引数は、range_or_single_index
- 第3引数は、insertion_index

以下はエラーになります。

```elixir
iex> Enum.slide([:a, :b, :c, :d, :e, :f, :g], 3..5, 4)
** (RuntimeError) Insertion index for slide must be outside the range being moved (tried to insert 3..5 at 4)
    (elixir 1.13.1) lib/enum.ex:2619: Enum.slide/3
```

実装が気になる方は以下をご参照くださいませ。

https://github.com/elixir-lang/elixir/blob/v1.13.4/lib/elixir/lib/enum.ex#L2582-L2696

プルリクは[こちら](https://github.com/elixir-lang/elixir/pull/11349)です。

https://github.com/elixir-lang/elixir/pull/11349

> The classic use case is this: Suppose you have a list of to-do items, which the user has ordered by priority:
> 1. Apply to college
> 2. Brush the dog
> 3. Change the car's oil
> 4. Deliver flowers
> 5. Exchange gifts

---

# Wrapping up :lgtm::lgtm::lgtm::lgtm::lgtm:

今日は、[Enum.slide/3](https://hexdocs.pm/elixir/Enum.html#slide/3)を楽しんでみました。
私は動きを追うことで精一杯でした。
きっとどこかで使う場面がくるのでしょう。

こんなとき使ったよ！　という事例をお持ちのかたはぜひお便り（コメント）をください。


Enjoy [Elixir](https://elixir-lang.org/):bangbang::bangbang::bangbang:
<font color="purple">$\huge{Enjoy\ Elixir🚀}$</font>


以上です。





---

I organize [autoracex](https://autoracex.connpass.com/).
And I take part in [NervesJP](https://nerves-jp.connpass.com/), [fukuoka.ex](https://fukuokaex.connpass.com/), [EDI](https://fukuokaex.connpass.com/), [tokyo.ex](https://beam-lang.connpass.com/), [Pelemay](https://pelemay.connpass.com/).
I hope someday you'll join us.

[We Are The Alchemists, my friends!](https://www.youtube.com/watch?v=04854XqcfCY)

---

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">We appreciate this shoutout, Torifuku! <a href="https://t.co/dThmJg4CYN">pic.twitter.com/dThmJg4CYN</a></p>&mdash; ClickUp (@clickup) <a href="https://twitter.com/clickup/status/1513541411634913284?ref_src=twsrc%5Etfw">April 11, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>