-module(qrkit@internal@bitstream).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/qrkit/internal/bitstream.gleam").
-export([new/0, length_bits/1, append_bits/3, append_bit/2, append_byte/2, append_bytes/2, pad_to_byte_boundary/1, to_bit_array/1, concat/1, to_byte_list/1]).
-export_type([bit_stream/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(false).
-opaque bit_stream() :: {bit_stream, list(bitstring()), integer()}.
-file("src/qrkit/internal/bitstream.gleam", 10).
?DOC(false).
-spec new() -> bit_stream().
new() ->
{bit_stream, [], 0}.
-file("src/qrkit/internal/bitstream.gleam", 14).
?DOC(false).
-spec length_bits(bit_stream()) -> integer().
length_bits(Stream) ->
{bit_stream, _, Length_bits} = Stream,
Length_bits.
-file("src/qrkit/internal/bitstream.gleam", 19).
?DOC(false).
-spec append_bits(bit_stream(), integer(), integer()) -> bit_stream().
append_bits(Stream, Value, Bits) ->
{bit_stream, Parts, Length_bits} = Stream,
{bit_stream,
[<<Value:(lists:max([(Bits), 0]))>> | Parts],
Length_bits + Bits}.
-file("src/qrkit/internal/bitstream.gleam", 24).
?DOC(false).
-spec append_bit(bit_stream(), boolean()) -> bit_stream().
append_bit(Stream, Value) ->
case Value of
true ->
append_bits(Stream, 1, 1);
false ->
append_bits(Stream, 0, 1)
end.
-file("src/qrkit/internal/bitstream.gleam", 31).
?DOC(false).
-spec append_byte(bit_stream(), integer()) -> bit_stream().
append_byte(Stream, Byte) ->
append_bits(Stream, Byte, 8).
-file("src/qrkit/internal/bitstream.gleam", 35).
?DOC(false).
-spec append_bytes(bit_stream(), bitstring()) -> bit_stream().
append_bytes(Stream, Bytes) ->
{bit_stream, Parts, Length_bits} = Stream,
{bit_stream, [Bytes | Parts], Length_bits + erlang:bit_size(Bytes)}.
-file("src/qrkit/internal/bitstream.gleam", 46).
?DOC(false).
-spec pad_to_byte_boundary(bit_stream()) -> bit_stream().
pad_to_byte_boundary(Stream) ->
Remainder = length_bits(Stream) rem 8,
case Remainder =:= 0 of
true ->
Stream;
false ->
append_bits(Stream, 0, 8 - Remainder)
end.
-file("src/qrkit/internal/bitstream.gleam", 54).
?DOC(false).
-spec to_bit_array(bit_stream()) -> bitstring().
to_bit_array(Stream) ->
{bit_stream, Parts, _} = Stream,
_pipe = Parts,
_pipe@1 = lists:reverse(_pipe),
gleam_stdlib:bit_array_concat(_pipe@1).
-file("src/qrkit/internal/bitstream.gleam", 40).
?DOC(false).
-spec concat(list(bit_stream())) -> bit_stream().
concat(Streams) ->
gleam@list:fold(
Streams,
new(),
fun(Acc, Stream) -> append_bytes(Acc, to_bit_array(Stream)) end
).
-file("src/qrkit/internal/bitstream.gleam", 63).
?DOC(false).
-spec do_to_byte_list(bitstring(), list(integer())) -> list(integer()).
do_to_byte_list(Bits, Acc) ->
case Bits of
<<>> ->
lists:reverse(Acc);
<<Byte, Rest/binary>> ->
do_to_byte_list(Rest, [Byte | Acc]);
_ ->
lists:reverse(Acc)
end.
-file("src/qrkit/internal/bitstream.gleam", 59).
?DOC(false).
-spec to_byte_list(bit_stream()) -> list(integer()).
to_byte_list(Stream) ->
do_to_byte_list(to_bit_array(Stream), []).