Skip to content

Instantly share code, notes, and snippets.

@sabiwara
Last active December 17, 2021 10:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sabiwara/97c480c2076666ba9b98cf7a142a5a0f to your computer and use it in GitHub Desktop.
Save sabiwara/97c480c2076666ba9b98cf7a142a5a0f to your computer and use it in GitHub Desktop.
Elixir comprehension ideas
# Idea 1: using $, $$...
{sections, _} =
for section <- sections,
let: [$section_counter: 1, $lesson_counter: 1] do
$lesson_counter = if section["reset_lesson_position"], do: 1, else: $lesson_counter
{lessons, $lesson_counter} =
for lesson <- section["lessons"], let: [$$lesson_counter: $lesson_counter] do
lesson = Map.put(lesson, "position", $$lesson_counter)
$$lesson_counter = $$lesson_counter + 1
lesson
end
section =
section
|> Map.put("lessons", lessons)
|> Map.put("position", $section_counter)
$section_counter = $section_counter + 1
section
end
# Idea 2: forcing to split as a separate function:
def get_sections do
{sections, _} =
for section <- sections,
let: [$section_counter: 1, $lesson_counter: 1] do
$lesson_counter = if section["reset_lesson_position"], do: 1, else: $lesson_counter
{lessons, $lesson_counter} = get_lessons($lesson_counter)
section =
section
|> Map.put("lessons", lessons)
|> Map.put("position", $section_counter)
$section_counter = $section_counter + 1
section
end
sections
end
def get_lessons(lesson_counter) do
for lesson <- section["lessons"], let: [$lesson_counter: lesson_counter] do
lesson = Map.put(lesson, "position", $lesson_counter)
$lesson_counter = $lesson_counter + 1
lesson
end
end
# Idea 3: compile error if forgot to re-bind $lesson_counter
{sections, _} =
for section <- sections,
let: [$section_counter: 1, $lesson_counter: 1] do
$lesson_counter = if section["reset_lesson_position"], do: 1, else: $lesson_counter
{lessons, $lesson_counter} =
for lesson <- section["lessons"] do
lesson = Map.put(lesson, "position", $lesson_counter)
# COMPILE ERROR: $lesson_counter CANNOT BE REASSIGNED IN THIS SCOPE!
# .. <explanation>
$lesson_counter = $lesson_counter + 1
lesson
end
section =
section
|> Map.put("lessons", lessons)
|> Map.put("position", $section_counter)
$section_counter = $section_counter + 1
section
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment