defmodule Parser do
def run(str), do: IO.inspect do_parse(str, [])
defp do_parse("", agg), do: Enum.reverse(agg)
defp do_parse("<" <> rest, agg), do: in_tag(rest, agg)
defp do_parse(<<_, rest::binary>>, agg), do: do_parse(rest, agg)
defp in_tag(data, curr \\ "", agg)
defp in_tag(">" <> rest, curr, agg), do: do_parse(rest, [curr | agg])
defp in_tag(<<c, rest::binary>>, curr, agg), do: in_tag(rest, curr <> <<c>>, agg)
end
Parser.run("ala ma <kota> i <psa> hey") # ["kota", "psa"]
Parser.run("<ala>ma</kota>") # ["ala", "/kota"]
Parser.run("<a<b>c>") # ["a<b"]
Parser.run(">a>b<c>d<e<f>") # ["c", "e<f"]
ZGVmbW9kdWxlIFBhcnNlciBkbwogIGRlZiBydW4oc3RyKSwgZG86IElPLmluc3BlY3QgZG9fcGFyc2Uoc3RyLCBbXSkKICAKICBkZWZwIGRvX3BhcnNlKCIiLCBhZ2cpLCBkbzogRW51bS5yZXZlcnNlKGFnZykKICBkZWZwIGRvX3BhcnNlKCI8IiA8PiByZXN0LCBhZ2cpLCBkbzogaW5fdGFnKHJlc3QsIGFnZykKICBkZWZwIGRvX3BhcnNlKDw8XywgcmVzdDo6YmluYXJ5Pj4sIGFnZyksIGRvOiBkb19wYXJzZShyZXN0LCBhZ2cpCiAgCiAgZGVmcCBpbl90YWcoZGF0YSwgY3VyciBcXCAiIiwgYWdnKQogIGRlZnAgaW5fdGFnKCI+IiA8PiByZXN0LCBjdXJyLCBhZ2cpLCBkbzogZG9fcGFyc2UocmVzdCwgW2N1cnIgfCBhZ2ddKQogIGRlZnAgaW5fdGFnKDw8YywgcmVzdDo6YmluYXJ5Pj4sIGN1cnIsIGFnZyksIGRvOiBpbl90YWcocmVzdCwgY3VyciA8PiA8PGM+PiwgYWdnKQplbmQKClBhcnNlci5ydW4oImFsYSBtYSA8a290YT4gaSA8cHNhPiBoZXkiKSAjIFsia290YSIsICJwc2EiXQpQYXJzZXIucnVuKCI8YWxhPm1hPC9rb3RhPiIpICAgICAgICAgICAgIyBbImFsYSIsICIva290YSJdClBhcnNlci5ydW4oIjxhPGI+Yz4iKSAgICAgICAgICAgICAgICAgICAjIFsiYTxiIl0KUGFyc2VyLnJ1bigiPmE+YjxjPmQ8ZTxmPiIpICAgICAgICAgICAgICMgWyJjIiwgImU8ZiJdCg==