lib/solver/convergence.ex

defmodule Solver.Convergence do
  def converge(stream, epsilon) do
    stream
    |> framed_as_pairs()
    |> Stream.take(500)
    |> Stream.filter(fn x -> norm(x) < epsilon end)
    |> Enum.take(1)
    |> List.flatten()
    |> find()
  end

  defp framed_as_pairs(stream) do
    Stream.chunk_every(stream, 2, 1, [])
  end

  def norm([a, b]) do
    abs(a - b)
  end

  def norm([x]) do
    x
  end

  defp find([]) do
    :does_not_converge
  end

  defp find([_a, b]) do
    b
  end
end