require IEx; defmodule Spry do @moduledoc """ Documentation for `Spry`. """ def suspend(options \\ []) do default = [exclude: []] options = Keyword.merge(default, options) exclude = options[:exclude] all_pids = :application.info[:running] suspended = Enum.reduce all_pids, [], fn process, suspended -> name = elem(process, 0) pid = elem(process, 1) suspended = cond do pid == :undefined -> suspended name == :iex -> suspended # Don't suspend our own project - might not be necessary! # name == Mix.Project.get!().project[:app] -> # suspended # Don't suspend ourself pid == self() -> suspended pid in exclude or name in exclude -> suspended true -> :erlang.suspend_process(pid) suspended ++ [pid] end suspended end suspended end def resume(suspended) do Enum.map suspended, fn pid -> :erlang.resume_process(pid) end end def spry(options \\ []) do suspended = Spry.suspend(options) require IEx; IEx.pry() Spry.resume(suspended) end end