Vildulv
7/22/2016 - 3:34 PM

loop, while,break construct in elixir

loop, while,break construct in elixir

defmodule Loop do
  defmacro while(predicate, do: block) do
    quote do
      try do
        for _ <- Stream.cycle([:ok]) do
          if unquote(predicate) do
            unquote(block)
          else
            throw :break
          end
        end
      catch
        :break -> :ok
      end
    end
  end

  defmacro break, do: throw :break

  defmacro loop(do: block) do
    quote do
      try do
        for _ < Stream.cycle([:ok]) do
          unquote(block)
        end
      catch
        :break -> :ok
      end
    end
  end
end