Skip to content

Commit 0ce2fbb

Browse files
author
José Valim
committed
Move verify! to an is_doc guard in algebra
1 parent 04c5c80 commit 0ce2fbb

File tree

1 file changed

+26
-39
lines changed

1 file changed

+26
-39
lines changed

lib/elixir/lib/inspect/algebra.ex

Lines changed: 26 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,28 @@ defmodule Inspect.Algebra do
8282
defrecordp :doc_break, str: " " :: binary
8383
defrecordp :doc_group, doc: :doc_nil :: t
8484

85+
defmacrop is_doc(doc) do
86+
if __CALLER__.in_guard? do
87+
do_is_doc(doc)
88+
else
89+
var = quote do: doc
90+
quote do
91+
unquote(var) = unquote(doc)
92+
unquote(do_is_doc(var))
93+
end
94+
end
95+
end
96+
97+
defp do_is_doc(doc) do
98+
quote do
99+
unquote(doc) |> is_binary or
100+
unquote(doc) |> is_integer or
101+
unquote(doc) == :doc_nil or
102+
(unquote(doc) |> is_tuple and
103+
elem(unquote(doc), 0) in [:doc_cons, :doc_nest, :doc_break, :doc_group])
104+
end
105+
end
106+
85107
@doc """
86108
Returns `:doc_nil` which is a document entity used to represent
87109
nothingness. Takes no arguments.
@@ -107,10 +129,7 @@ defmodule Inspect.Algebra do
107129
108130
"""
109131
@spec concat(t, t) :: doc_cons_t
110-
def concat(x, y) do
111-
verify!(x)
112-
verify!(y)
113-
132+
def concat(x, y) when is_doc(x) and is_doc(y) do
114133
doc_cons(left: x, right: y)
115134
end
116135

@@ -119,8 +138,6 @@ defmodule Inspect.Algebra do
119138
"""
120139
@spec concat([t]) :: doc_cons_t
121140
def concat(docs) do
122-
Enum.each docs, &verify!(&1)
123-
124141
folddoc(docs, &concat(&1, &2))
125142
end
126143
@@ -136,15 +153,11 @@ defmodule Inspect.Algebra do
136153
137154
"""
138155
@spec nest(t, non_neg_integer) :: doc_nest_t
139-
def nest(x, 0) do
140-
verify!(x)
141-
156+
def nest(x, 0) when is_doc(x) do
142157
x
143158
end
144159
145-
def nest(x, i) when is_integer(i) do
146-
verify!(x)
147-
160+
def nest(x, i) when is_doc(x) and is_integer(i) do
148161
doc_nest(indent: i, doc: x)
149162
end
150163
@@ -216,9 +229,7 @@ defmodule Inspect.Algebra do
216229

217230
"""
218231
@spec group(t) :: doc_group_t
219-
def group(d) do
220-
verify!(d)
221-
232+
def group(d) when is_doc(d) do
222233
doc_group(doc: d)
223234
end
224235

@@ -409,28 +420,4 @@ defmodule Inspect.Algebra do
409420
prefix = repeat " ", i
410421
[@newline | [prefix | do_render d]]
411422
end
412-
413-
defp verify!(doc) do
414-
case verify(doc) do
415-
:ok ->
416-
:ok
417-
418-
_ ->
419-
raise ArgumentError, message: "invalid document type"
420-
end
421-
end
422-
423-
defp verify(doc) when doc |> is_binary or
424-
doc |> is_integer or
425-
doc == :doc_nil or
426-
doc |> is_record(:doc_cons) or
427-
doc |> is_record(:doc_nest) or
428-
doc |> is_record(:doc_break) or
429-
doc |> is_record(:doc_group) do
430-
:ok
431-
end
432-
433-
defp verify(v) do
434-
{ :error, { :invalid_doc, v } }
435-
end
436423
end

0 commit comments

Comments
 (0)