Packages

An embedded lisp interpreter based on the gleam implementation of MAL lisp.

Current section

Files

Jump to
kirala_l4u src l4u@l4u_util.erl
Raw

src/l4u@l4u_util.erl

-module(l4u@l4u_util).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([split_multiline_string/1]).
-spec read_multiline_string(binary(), binary()) -> {binary(), binary()}.
read_multiline_string(Src, Acc) ->
case Src of
<<""/utf8>> ->
{Acc, <<""/utf8>>};
<<"\"\"\""/utf8, Rest/binary>> ->
{<<Acc/binary, "\"\"\""/utf8>>, Rest};
_ ->
{Char, Rest@1} = begin
_pipe = gleam@string:pop_grapheme(Src),
gleam@result:unwrap(_pipe, {<<""/utf8>>, <<""/utf8>>})
end,
read_multiline_string(Rest@1, <<Acc/binary, Char/binary>>)
end.
-spec read_until_multiline_string(binary(), binary()) -> {binary(), binary()}.
read_until_multiline_string(Src, Acc) ->
case Src of
<<""/utf8>> ->
{Acc, <<""/utf8>>};
<<"\"\"\""/utf8, _/binary>> ->
{Acc, Src};
_ ->
{Char, Rest} = begin
_pipe = gleam@string:pop_grapheme(Src),
gleam@result:unwrap(_pipe, {<<""/utf8>>, <<""/utf8>>})
end,
read_until_multiline_string(Rest, <<Acc/binary, Char/binary>>)
end.
-spec split_multiline_rec(binary(), list(binary())) -> list(binary()).
split_multiline_rec(Src, Acc) ->
case Src of
<<""/utf8>> ->
gleam@list:reverse(Acc);
<<"\"\"\""/utf8, R1/binary>> ->
{Mlstr, Rest} = read_multiline_string(R1, <<"\"\"\""/utf8>>),
split_multiline_rec(Rest, [Mlstr | Acc]);
_ ->
{Str, Rest@1} = read_until_multiline_string(Src, <<""/utf8>>),
split_multiline_rec(Rest@1, [Str | Acc])
end.
-spec split_multiline_string(binary()) -> list(binary()).
split_multiline_string(Src) ->
split_multiline_rec(Src, []).