src/qrkit@internal@matrix.erl

-module(qrkit@internal@matrix).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/qrkit/internal/matrix.gleam").
-export([width/1, height/1, set/5, new/2, get/3, is_reserved/3, 'xor'/4, dark_count/1, total_cells/1, rows/1, positions/1]).
-export_type([matrix/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 matrix() :: {matrix,
        integer(),
        integer(),
        gleam@set:set(integer()),
        gleam@set:set(integer())}.

-file("src/qrkit/internal/matrix.gleam", 15).
?DOC(false).
-spec width(matrix()) -> integer().
width(Matrix) ->
    {matrix, Width, _, _, _} = Matrix,
    Width.

-file("src/qrkit/internal/matrix.gleam", 20).
?DOC(false).
-spec height(matrix()) -> integer().
height(Matrix) ->
    {matrix, _, Height, _, _} = Matrix,
    Height.

-file("src/qrkit/internal/matrix.gleam", 25).
?DOC(false).
-spec set(matrix(), integer(), integer(), boolean(), boolean()) -> matrix().
set(Matrix, Row, Col, Value, Is_reserved) ->
    {matrix, Width, Height, Dark, Reserved} = Matrix,
    Index = (Row * Width) + Col,
    Next_dark = case Value of
        true ->
            gleam@set:insert(Dark, Index);

        false ->
            gleam@set:delete(Dark, Index)
    end,
    Next_reserved = case Is_reserved of
        true ->
            gleam@set:insert(Reserved, Index);

        false ->
            Reserved
    end,
    {matrix, Width, Height, Next_dark, Next_reserved}.

-file("src/qrkit/internal/matrix.gleam", 11).
?DOC(false).
-spec new(integer(), integer()) -> matrix().
new(Width, Height) ->
    {matrix, Width, Height, gleam@set:new(), gleam@set:new()}.

-file("src/qrkit/internal/matrix.gleam", 45).
?DOC(false).
-spec get(matrix(), integer(), integer()) -> boolean().
get(Matrix, Row, Col) ->
    {matrix, Width, _, Dark, _} = Matrix,
    gleam@set:contains(Dark, (Row * Width) + Col).

-file("src/qrkit/internal/matrix.gleam", 64).
?DOC(false).
-spec is_reserved(matrix(), integer(), integer()) -> boolean().
is_reserved(Matrix, Row, Col) ->
    {matrix, Width, _, _, Reserved} = Matrix,
    gleam@set:contains(Reserved, (Row * Width) + Col).

-file("src/qrkit/internal/matrix.gleam", 50).
?DOC(false).
-spec 'xor'(matrix(), integer(), integer(), boolean()) -> matrix().
'xor'(Matrix, Row, Col, Value) ->
    case Value of
        false ->
            Matrix;

        true ->
            set(
                Matrix,
                Row,
                Col,
                not get(Matrix, Row, Col),
                is_reserved(Matrix, Row, Col)
            )
    end.

-file("src/qrkit/internal/matrix.gleam", 69).
?DOC(false).
-spec dark_count(matrix()) -> integer().
dark_count(Matrix) ->
    {matrix, _, _, Dark, _} = Matrix,
    gleam@set:size(Dark).

-file("src/qrkit/internal/matrix.gleam", 74).
?DOC(false).
-spec total_cells(matrix()) -> integer().
total_cells(Matrix) ->
    width(Matrix) * height(Matrix).

-file("src/qrkit/internal/matrix.gleam", 93).
?DOC(false).
-spec build_row(matrix(), integer(), integer(), list(boolean())) -> list(boolean()).
build_row(Matrix, Row, Col, Acc) ->
    case Col >= width(Matrix) of
        true ->
            lists:reverse(Acc);

        false ->
            build_row(Matrix, Row, Col + 1, [get(Matrix, Row, Col) | Acc])
    end.

-file("src/qrkit/internal/matrix.gleam", 82).
?DOC(false).
-spec build_rows(matrix(), integer(), list(list(boolean()))) -> list(list(boolean())).
build_rows(Matrix, Row, Acc) ->
    case Row >= height(Matrix) of
        true ->
            lists:reverse(Acc);

        false ->
            build_rows(Matrix, Row + 1, [build_row(Matrix, Row, 0, []) | Acc])
    end.

-file("src/qrkit/internal/matrix.gleam", 78).
?DOC(false).
-spec rows(matrix()) -> list(list(boolean())).
rows(Matrix) ->
    build_rows(Matrix, 0, []).

-file("src/qrkit/internal/matrix.gleam", 100).
?DOC(false).
-spec positions(matrix()) -> list({integer(), integer()}).
positions(Matrix) ->
    _pipe = qrkit@internal@util:range(0, height(Matrix) - 1),
    gleam@list:flat_map(
        _pipe,
        fun(Row) -> _pipe@1 = qrkit@internal@util:range(0, width(Matrix) - 1),
            gleam@list:map(_pipe@1, fun(Col) -> {Row, Col} end) end
    ).