-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
).