How to create cycle function in elixir

Hello, I want to create the loop of 4 numbers like this:

1 Purple
2 Blue
3 Orange
4 Green

these 4 numbers should be repeated again in my for loop

<%= for el <- posts_entries do %>
    <%= el["title"] %>
   <%= the_number_which_I_need %>
<% end %>

For example, In repeating the fifth number, I want to repeat the purple color again and 6 is been Blue and …

How do I do this ?

Stream.cycle([1,2,3,4]) |> Enum.take(10)

Thank you, I have 2 questions:

  1. how do I use this in my code, I need it to be printed a number in my code each loop, like this:
  • the_number_which_I_need = 1
  • the_number_which_I_need = 2
  • the_number_which_I_need = 3
  • the_number_which_I_need = 4
  • the_number_which_I_need = 1
<%= for el <- posts_entries do %>
    <%= el["title"] %>
   <%= the_number_which_I_need %>
<% end %>
  1. is there a way to create this in a function?
  1. Enum and Stream are your friends and loaded with a bunch of functions that can help you with this:
iex(1)> [:a, :b, :c, :d] |> Enum.with_index() |> Enum.map(fn {label, idx} -> {label, idx + 1} end) |> Stream.cycle() |> Stream.map(fn {label, nr} -> IO.puts "#{nr}: #{label}" end) |> Enum.take(10)
1: a
2: b
3: c
4: d
1: a
2: b
3: c
4: d
1: a
2: b
[:ok, :ok, :ok, :ok, :ok, :ok, :ok, :ok, :ok, :ok]
  1. Of course, just wrap it in a def, I leave this to your homework.
2 Likes

Oh, sure. You can use Enum.zip which returns list of tuples:

posts_entries = ["a", "b", "c", "d", "e", "f", "g"]
colors = Stream.cycle(["purple", "red", "orange"])

for {el, color} <- Enum.zip(posts_entries, colors) do
  IO.puts("#{el} (#{color})")
end

I’m not sure what you mean exactly, but would something like this work?

def colored_posts(posts, colors) do
  Enum.zip(posts, Stream.cycle(colors))
end
2 Likes