Skip to content

Commit 6eacf81

Browse files
committed
WIP (Extract index matching)
1 parent 2eb1a9f commit 6eacf81

File tree

1 file changed

+16
-36
lines changed

1 file changed

+16
-36
lines changed

lib/msgpax/unpacker.ex

Lines changed: 16 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,7 @@ defmodule Msgpax.Unpacker do
5858
for {formats, value} <- primitives, format <- formats do
5959
defp unpack(<<unquote_splicing(format), rest::bits>>, result, options, outer, index, count) do
6060
result = [unquote(value) | result]
61-
case index + 1 do
62-
^count ->
63-
unpack_continue(rest, options, outer, result, count)
64-
index ->
65-
unpack(rest, result, options, outer, index, count)
66-
end
61+
unpack_continue(rest, result, options, outer, index, count)
6762
end
6863
end
6964

@@ -76,14 +71,7 @@ defmodule Msgpax.Unpacker do
7671
defp unpack(<<unquote_splicing(format), rest::bits>>, result, options, outer, index, count) do
7772
case unquote(quote(do: length)) do
7873
0 ->
79-
result = [[] | result]
80-
case index + 1 do
81-
^count ->
82-
unpack_continue(rest, options, outer, result, count)
83-
index ->
84-
unpack(rest, result, options, outer, index, count)
85-
end
86-
74+
unpack_continue(rest, [[] | result], options, outer, index, count)
8775
length ->
8876
unpack(rest, result, options, [:list, index, count | outer], 0, length)
8977
end
@@ -99,14 +87,7 @@ defmodule Msgpax.Unpacker do
9987
defp unpack(<<unquote_splicing(format), rest::bits>>, result, options, outer, index, count) do
10088
case unquote(quote(do: length)) do
10189
0 ->
102-
result = [%{} | result]
103-
case index + 1 do
104-
^count ->
105-
unpack_continue(rest, options, outer, result, count)
106-
index ->
107-
unpack(rest, result, options, outer, index, count)
108-
end
109-
90+
unpack_continue(rest, [%{} | result], options, outer, index, count)
11091
length ->
11192
unpack(rest, result, options, [:map, index, count | outer], 0, length * 2)
11293
end
@@ -121,13 +102,7 @@ defmodule Msgpax.Unpacker do
121102
for format <- binaries do
122103
defp unpack(<<unquote_splicing(format), rest::bits>>, result, options, outer, index, count) do
123104
value = unpack_binary(unquote(quote(do: content)), options)
124-
result = [value | result]
125-
case index + 1 do
126-
^count ->
127-
unpack_continue(rest, options, outer, result, count)
128-
index ->
129-
unpack(rest, result, options, outer, index, count)
130-
end
105+
unpack_continue(rest, [value | result], options, outer, index, count)
131106
end
132107
end
133108

@@ -144,13 +119,7 @@ defmodule Msgpax.Unpacker do
144119
for format <- extensions do
145120
defp unpack(<<unquote_splicing(format), rest::bits>>, result, options, outer, index, count) do
146121
value = unpack_ext(unquote(quote(do: type)), unquote(quote(do: content)), options)
147-
result = [value | result]
148-
case index + 1 do
149-
^count ->
150-
unpack_continue(rest, options, outer, result, count)
151-
index ->
152-
unpack(rest, result, options, outer, index, count)
153-
end
122+
unpack_continue(rest, [value | result], options, outer, index, count)
154123
end
155124
end
156125

@@ -162,6 +131,17 @@ defmodule Msgpax.Unpacker do
162131
throw :incomplete
163132
end
164133

134+
@compile {:inline, [unpack_continue: 6]}
135+
136+
defp unpack_continue(rest, result, options, outer, index, count) do
137+
case index + 1 do
138+
^count ->
139+
unpack_continue(rest, options, outer, result, count)
140+
index ->
141+
unpack(rest, result, options, outer, index, count)
142+
end
143+
end
144+
165145
defp unpack_continue(<<buffer::bits>>, options, [kind, index, length | outer], result, count) do
166146
result = build_collection(result, count, kind)
167147
case index + 1 do

0 commit comments

Comments
 (0)