Last active
December 17, 2021 10:37
-
-
Save sabiwara/97c480c2076666ba9b98cf7a142a5a0f to your computer and use it in GitHub Desktop.
Elixir comprehension ideas
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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