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