src/qrkit@internal@bitstream.erl

-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), []).