@@ -82,6 +82,28 @@ defmodule Inspect.Algebra do
82
82
defrecordp :doc_break , str: " " :: binary
83
83
defrecordp :doc_group , doc: :doc_nil :: t
84
84
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
+
85
107
@ doc """
86
108
Returns `:doc_nil` which is a document entity used to represent
87
109
nothingness. Takes no arguments.
@@ -107,10 +129,7 @@ defmodule Inspect.Algebra do
107
129
108
130
"""
109
131
@ 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
114
133
doc_cons ( left: x , right: y )
115
134
end
116
135
@@ -119,8 +138,6 @@ defmodule Inspect.Algebra do
119
138
"" "
120
139
@spec concat([t]) :: doc_cons_t
121
140
def concat(docs) do
122
- Enum.each docs, &verify!(&1)
123
-
124
141
folddoc(docs, &concat(&1, &2))
125
142
end
126
143
@@ -136,15 +153,11 @@ defmodule Inspect.Algebra do
136
153
137
154
" ""
138
155
@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
142
157
x
143
158
end
144
159
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
148
161
doc_nest(indent: i, doc: x)
149
162
end
150
163
@@ -216,9 +229,7 @@ defmodule Inspect.Algebra do
216
229
217
230
"""
218
231
@spec group(t) :: doc_group_t
219
- def group(d) do
220
- verify!(d)
221
-
232
+ def group(d) when is_doc(d) do
222
233
doc_group(doc: d)
223
234
end
224
235
@@ -409,28 +420,4 @@ defmodule Inspect.Algebra do
409
420
prefix = repeat " ", i
410
421
[@newline | [prefix | do_render d]]
411
422
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
436
423
end
0 commit comments