Backgrond
I am following the book Designing Elixir System with OTP book and I hit the (Fun)ctions part of the “Do Fun Things with Big Loud Wildbeests” layer.
To test my understanding I am adding dialyzer to everything while trying to make it compile.
Problem
However, I have hit a roadblock. I can’t understand the Questions.ex
file. In the book they talk about lists and generators (which are functions) but I don’t understand what this lists and functions are supposed to have inside or return.
Here is the file in question (get it? The file in question? I’ll show myself out )
defmodule Mastery.Core.Question do
@moduledoc """
Questions consist of the text the user was asked, the used to create them and
the substitutions used to build the template.
"""
alias Mastery.Core.Template
@type t() :: %__MODULE__{
asked: String.t,
template: Template.t,
substitutions: %{substitution: any}
}
@enforce_keys [:asked, :substitutions, :template]
defstruct ~w[asked substitutions template]a
@spec new(Template.t) :: __MODULE__.t
def new(%Template{} = template) do
template.generators
|> Enum.map(&build_substitution/1)
|> evaluate(template)
end
# @spec evaluate(?????, Template.t) :: __MODULE__.t
defp evaluate(substitutions, template), do:
%__MODULE__{
asked: compile(template, substitutions),
substitutions: substitutions,
template: template
}
# @spec compile(Template.t, ??????) :: any????
defp compile(template, substitutions) do
template.compiled
|> Code.eval_quoted(assigns: substitutions)
|> elem(0)
end
# @spec build_substitution({atom???, [any???] | function()}) :: {atom, any???}
defp build_substitution({name, choices_or_gen}), do:
{name, choose(choices_or_gen)}
# ???? What is this supposed to return? any? a String.t ?
defp choose(choices) when is_list(choices), do: Enum.random(choices)
defp choose(generator) when is_function(generator), do: generator.()
end
Questions
As you can see, I am having trouble identifying what my functions return, namely the last function, choose/1
.
I have re-read the book and I couldn’t find anything regarding the types these functions should manage. I am focusing and guessing based on the official docs of EEx.
Can anyone help me figure this out?