Powered by AppSignal & Oban Pro

32.7 Pipelines

327_pipelines.livemd

32.7 Pipelines

Section

defmodule Human do
  defstruct sex: :female, age: 0, name: "Buffy Summers"
end

:ok
:ok
humans =
  [
    %Human{age: 17},
    %Human{sex: :male, age: 12, name: "Luca"},
    %Human{sex: :female, age: 22, name: "Sophie"},
    %Human{sex: :male, age: 34, name: "Klaus"},
    %Human{sex: :female, age: 19, name: "Perinne"},
    %Human{sex: :female, age: 23, name: "Fie"},
    %Human{sex: :male, age: 20, name: "Asger"},
    %Human{sex: :female, age: 27, name: "Pernille"},
    %Human{sex: :male, age: 21, name: "Peter"},
    %Human{sex: :female, age: 26, name: "Dominika"},
    %Human{sex: :male, age: 7, name: "Mathias"},
  ]

:ok
:ok
# Find the youngest male who is more than 18 years, else -1
defmodule MaleAgeFinder do
  def minAge(humans) do
    minAge(humans, -1)
  end
  defp minAge([], record) do
    record
  end
  defp minAge(humans, record)do
    human = hd(humans)
    if(human.sex == :male && human.age >= 18 && (record == -1 || human.age < record)) do
      minAge(tl(humans), human.age)
    else
      minAge(tl(humans), record)
    end
  end
end

MaleAgeFinder.minAge(humans)
20
defmodule MaleAgeFinderHighOrder do
  def minAge(humans) do
    sub = 
        humans
        |> Enum.filter(fn human -> human.sex == :male && human.age >= 18 end)
        |> Enum.min_by(fn human -> human.age end)
    sub.age
  end
end

MaleAgeFinderHighOrder.minAge(humans)
20