Current section
Files
Jump to
Current section
Files
src/vec@vec2i.erl
-module(vec@vec2i).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/vec/vec2i.gleam").
-export([clamp/3, min/2, max/2, absolute_value/1, to_string/2, to_vec2f/1, negate/1, add/2, sum/1, multiply/2, product/1, remainder/2, modulo/2, divide/2, floor_divide/2, subtract/2, range/4, length_squared/1, length/1, compare_length/2, distance_squared/2, distance/2, compare_distance/3, scale/2, cross/2, dot/2, project/2, slide/2, reflect/2, mirror/2, rotate/2, anchor_position/3, anchor_rotation/3]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
-file("src/vec/vec2i.gleam", 50).
?DOC(
" Returns a new vector with all components clamped between a lower and upper\n"
" bound.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert Vec2(12, -34) |> clamp(Vec2(10, 21), Vec2(14, 18)) == Vec2(12, 18)\n"
" ```\n"
).
-spec clamp(
vec@vec2:vec2(integer()),
vec@vec2:vec2(integer()),
vec@vec2:vec2(integer())
) -> vec@vec2:vec2(integer()).
clamp(Vector, Start_bound, Stop_bound) ->
vec@vec2:map3(Vector, Start_bound, Stop_bound, fun gleam@int:clamp/3).
-file("src/vec/vec2i.gleam", 62).
?DOC(
" Compares two vectors, returning the smaller of the two.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert min(Vec2(12, -34), Vec2(10, 21)) == Vec2(10, -34)\n"
" ```\n"
).
-spec min(vec@vec2:vec2(integer()), vec@vec2:vec2(integer())) -> vec@vec2:vec2(integer()).
min(A, B) ->
_pipe = A,
vec@vec2:map2(_pipe, B, fun gleam@int:min/2).
-file("src/vec/vec2i.gleam", 74).
?DOC(
" Compares two vectors, returning the larger of the two.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert max(Vec2(12, -34), Vec2(14, -93)) == Vec2(14, -34)\n"
" ```\n"
).
-spec max(vec@vec2:vec2(integer()), vec@vec2:vec2(integer())) -> vec@vec2:vec2(integer()).
max(A, B) ->
_pipe = A,
vec@vec2:map2(_pipe, B, fun gleam@int:max/2).
-file("src/vec/vec2i.gleam", 86).
?DOC(
" Returns a new vector with all elements in absolute values.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert Vec2(12, -34) |> absolute_value == Vec2(12, 34)\n"
" ```\n"
).
-spec absolute_value(vec@vec2:vec2(integer())) -> vec@vec2:vec2(integer()).
absolute_value(Vector) ->
_pipe = Vector,
vec@vec2:map(_pipe, fun gleam@int:absolute_value/1).
-file("src/vec/vec2i.gleam", 98).
?DOC(
" Prints a given vector to a string with a given separator.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert Vec2(12, -34) |> to_string(\" \") == \"12 -34\"\n"
" ```\n"
).
-spec to_string(vec@vec2:vec2(integer()), binary()) -> binary().
to_string(Vector, Separator) ->
_pipe = Vector,
_pipe@1 = vec@vec2:map(_pipe, fun erlang:integer_to_binary/1),
_pipe@2 = vec@vec2:to_list(_pipe@1),
gleam@string:join(_pipe@2, Separator).
-file("src/vec/vec2i.gleam", 110).
?DOC(
" Takes an int vector and returns its value as a float vector.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert Vec2(12, -34) |> to_vec2f == Vec2(12.0, -34.0)\n"
" ```\n"
).
-spec to_vec2f(vec@vec2:vec2(integer())) -> vec@vec2:vec2(float()).
to_vec2f(Vector) ->
_pipe = Vector,
vec@vec2:map(_pipe, fun erlang:float/1).
-file("src/vec/vec2i.gleam", 122).
?DOC(
" Returns a new vector with all elements negated.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert Vec2(12, -34) |> negate == Vec2(-12, 34)\n"
" ```\n"
).
-spec negate(vec@vec2:vec2(integer())) -> vec@vec2:vec2(integer()).
negate(Vector) ->
_pipe = Vector,
vec@vec2:map(_pipe, fun gleam@int:negate/1).
-file("src/vec/vec2i.gleam", 238).
?DOC(
" Adds two vectors together.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert Vec2(12, -34) |> add(Vec2(21, 45)) == Vec2(33, 11)\n"
" ```\n"
).
-spec add(vec@vec2:vec2(integer()), vec@vec2:vec2(integer())) -> vec@vec2:vec2(integer()).
add(A, B) ->
_pipe = A,
vec@vec2:map2(_pipe, B, fun gleam@int:add/2).
-file("src/vec/vec2i.gleam", 141).
?DOC(
" Sums a list of vectors.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert\n"
" [\n"
" Vec2(12, -34),\n"
" Vec2(21, 45),\n"
" Vec2(33, 0),\n"
" ]\n"
" |> sum\n"
" == Vec2(66, 11)\n"
" ```\n"
).
-spec sum(list(vec@vec2:vec2(integer()))) -> vec@vec2:vec2(integer()).
sum(Vectors) ->
_pipe = Vectors,
gleam@list:fold(_pipe, vec@vec2:splat(0), fun add/2).
-file("src/vec/vec2i.gleam", 250).
?DOC(
" Multiplies two vectors together.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert Vec2(12, -34) |> multiply(Vec2(2, -3)) == Vec2(24, 102)\n"
" ```\n"
).
-spec multiply(vec@vec2:vec2(integer()), vec@vec2:vec2(integer())) -> vec@vec2:vec2(integer()).
multiply(A, B) ->
_pipe = A,
vec@vec2:map2(_pipe, B, fun gleam@int:multiply/2).
-file("src/vec/vec2i.gleam", 160).
?DOC(
" Multiplies a list of vectors and returns the product.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert\n"
" [\n"
" Vec2(12, -34),\n"
" Vec2(21, -10),\n"
" Vec2(32, 20),\n"
" ]\n"
" |> product\n"
" == Vec2(8064, 6800)\n"
" ```\n"
).
-spec product(list(vec@vec2:vec2(integer()))) -> vec@vec2:vec2(integer()).
product(Vectors) ->
_pipe = Vectors,
gleam@list:fold(_pipe, vec@vec2:splat(1), fun multiply/2).
-file("src/vec/vec2i.gleam", 177).
?DOC(
" Computes the remainder of an integer vector division of inputs as a\n"
" `Result`.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert Vec2(13, -13) |> remainder(Vec2(3, 3)) == Ok(Vec2(1, -1))\n"
" ```\n"
"\n"
" ```gleam\n"
" assert Vec2(12, -34) |> remainder(Vec2(0, 1)) == Error(Nil)\n"
" ```\n"
).
-spec remainder(vec@vec2:vec2(integer()), vec@vec2:vec2(integer())) -> {ok,
vec@vec2:vec2(integer())} |
{error, nil}.
remainder(Dividend, Divisor) ->
_pipe = Dividend,
_pipe@1 = vec@vec2:map2(_pipe, Divisor, fun gleam@int:remainder/2),
vec@vec2:result(_pipe@1).
-file("src/vec/vec2i.gleam", 193).
?DOC(
" Returns the modulo of the inputs as a `Result`.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert Vec2(13, 13) |> modulo(Vec2(3, -3)) == Ok(Vec2(1, -2))\n"
" ```\n"
"\n"
" ```gleam\n"
" assert Vec2(-13, -13) |> modulo(Vec2(3, -3)) == Ok(Vec2(2, -1))\n"
" ```\n"
).
-spec modulo(vec@vec2:vec2(integer()), vec@vec2:vec2(integer())) -> {ok,
vec@vec2:vec2(integer())} |
{error, nil}.
modulo(Dividend, Divisor) ->
_pipe = Dividend,
_pipe@1 = vec@vec2:map2(_pipe, Divisor, fun gleam@int:modulo/2),
vec@vec2:result(_pipe@1).
-file("src/vec/vec2i.gleam", 209).
?DOC(
" Returns division of the inputs as a `Result`.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert Vec2(12, -34) |> divide(Vec2(2, 5)) == Ok(Vec2(6, -6))\n"
" ```\n"
"\n"
" ```gleam\n"
" assert Vec2(12, -34) |> divide(Vec2(0, 5)) == Error(Nil)\n"
" ```\n"
).
-spec divide(vec@vec2:vec2(integer()), vec@vec2:vec2(integer())) -> {ok,
vec@vec2:vec2(integer())} |
{error, nil}.
divide(Dividend, Divisor) ->
_pipe = Dividend,
_pipe@1 = vec@vec2:map2(_pipe, Divisor, fun gleam@int:divide/2),
vec@vec2:result(_pipe@1).
-file("src/vec/vec2i.gleam", 226).
?DOC(
" Performs a *floored* integer vector division, which means that the result\n"
" will always be rounded towards negative infinity.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert Vec2(12, -34) |> floor_divide(Vec2(2, 5)) == Ok(Vec2(6, -7))\n"
" ```\n"
"\n"
" ```gleam\n"
" assert Vec2(12, -34) |> floor_divide(Vec2(0, 5)) == Error(Nil)\n"
" ```\n"
).
-spec floor_divide(vec@vec2:vec2(integer()), vec@vec2:vec2(integer())) -> {ok,
vec@vec2:vec2(integer())} |
{error, nil}.
floor_divide(Dividend, Divisor) ->
_pipe = Dividend,
_pipe@1 = vec@vec2:map2(_pipe, Divisor, fun gleam@int:floor_divide/2),
vec@vec2:result(_pipe@1).
-file("src/vec/vec2i.gleam", 262).
?DOC(
" Subtracts one vector from another.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert Vec2(12, -34) |> subtract(Vec2(7, -45)) == Vec2(5, 11)\n"
" ```\n"
).
-spec subtract(vec@vec2:vec2(integer()), vec@vec2:vec2(integer())) -> vec@vec2:vec2(integer()).
subtract(A, B) ->
_pipe = A,
vec@vec2:map2(_pipe, B, fun gleam@int:subtract/2).
-file("src/vec/vec2i.gleam", 278).
?DOC(
" Run a function for each vector between vectors `from` and `to`.\n"
"\n"
" `from` is inclusive, and `to` is exclusive.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" range(from: zero, to: vec2.splat(3), with: dict.new(), run: fn(acc, v) {\n"
" acc |> dict.insert(v, v.x + v.y)\n"
" })\n"
" ```\n"
).
-spec range(
vec@vec2:vec2(integer()),
vec@vec2:vec2(integer()),
GUI,
fun((GUI, vec@vec2:vec2(integer())) -> GUI)
) -> GUI.
range(Start, Stop, Acc, Reducer) ->
gleam@int:range(
erlang:element(3, Start),
erlang:element(3, Stop),
Acc,
fun(Acc@1, Y) ->
gleam@int:range(
erlang:element(2, Start),
erlang:element(2, Stop),
Acc@1,
fun(Acc@2, X) -> Reducer(Acc@2, {vec2, X, Y}) end
)
end
).
-file("src/vec/vec2i.gleam", 299).
?DOC(
" Returns the squared length (squared magnitude) of the vector.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert Vec2(12, -34) |> length_squared == 1300\n"
" ```\n"
).
-spec length_squared(vec@vec2:vec2(integer())) -> integer().
length_squared(Vector) ->
_pipe = Vector,
_pipe@1 = vec@vec2:to_list(_pipe),
_pipe@2 = gleam@list:map(_pipe@1, fun(Element) -> Element * Element end),
gleam@int:sum(_pipe@2).
-file("src/vec/vec2i.gleam", 314).
?DOC(
" Returns the length (magnitude) of the vector.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert Vec2(12, -34) |> length == 36.06\n"
" ```\n"
).
-spec length(vec@vec2:vec2(integer())) -> float().
length(Vector) ->
Length@1 = case begin
_pipe = Vector,
_pipe@1 = length_squared(_pipe),
gleam@int:square_root(_pipe@1)
end of
{ok, Length} -> Length;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"vec/vec2i"/utf8>>,
function => <<"length"/utf8>>,
line => 315,
value => _assert_fail,
start => 7066,
'end' => 7133,
pattern_start => 7077,
pattern_end => 7087})
end,
Length@1.
-file("src/vec/vec2i.gleam", 329).
?DOC(
" Compares two vector's lengths, returning an `Order`:\n"
" `Lt` for lower than, `Eq` for equals, or `Gt` for greater than.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert compare_length(Vec2(12, -34), Vec2(2, 3)) == Gt\n"
" ```\n"
).
-spec compare_length(vec@vec2:vec2(integer()), vec@vec2:vec2(integer())) -> gleam@order:order().
compare_length(A, B) ->
gleam@int:compare(
begin
_pipe = A,
length_squared(_pipe)
end,
begin
_pipe@1 = B,
length_squared(_pipe@1)
end
).
-file("src/vec/vec2i.gleam", 341).
?DOC(
" Returns the squared distance between two vectors.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert Vec2(12, -34) |> distance_squared(Vec2(2, 3)) == 1469\n"
" ```\n"
).
-spec distance_squared(vec@vec2:vec2(integer()), vec@vec2:vec2(integer())) -> integer().
distance_squared(A, B) ->
_pipe = A,
_pipe@1 = subtract(_pipe, B),
length_squared(_pipe@1).
-file("src/vec/vec2i.gleam", 353).
?DOC(
" Returns the distance between two vectors.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert Vec2(12, -34) |> distance(Vec2(2, 3)) == 38.33\n"
" ```\n"
).
-spec distance(vec@vec2:vec2(integer()), vec@vec2:vec2(integer())) -> float().
distance(A, B) ->
Distance@1 = case begin
_pipe = distance_squared(A, B),
gleam@int:square_root(_pipe)
end of
{ok, Distance} -> Distance;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"vec/vec2i"/utf8>>,
function => <<"distance"/utf8>>,
line => 354,
value => _assert_fail,
start => 7970,
'end' => 8037,
pattern_start => 7981,
pattern_end => 7993})
end,
Distance@1.
-file("src/vec/vec2i.gleam", 368).
?DOC(
" Compares two vector's distances to a vector, returning an `Order`:\n"
" `Lt` for lower than, `Eq` for equals, or `Gt` for greater than.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert compare_distance(Vec2(12, -34), Vec2(2, 3), Vec2(-25, 67)) == Gt\n"
" ```\n"
).
-spec compare_distance(
vec@vec2:vec2(integer()),
vec@vec2:vec2(integer()),
vec@vec2:vec2(integer())
) -> gleam@order:order().
compare_distance(A, B, Vector) ->
gleam@int:compare(
begin
_pipe = A,
distance_squared(_pipe, Vector)
end,
begin
_pipe@1 = B,
distance_squared(_pipe@1, Vector)
end
).
-file("src/vec/vec2i.gleam", 380).
?DOC(
" Returns a new vector containing the elements multiplies by `scalar`.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert Vec2(12, -34) |> scale(2) == Vec2(24, -68)\n"
" ```\n"
).
-spec scale(vec@vec2:vec2(integer()), integer()) -> vec@vec2:vec2(integer()).
scale(Vector, Scalar) ->
_pipe = Vector,
vec@vec2:map(
_pipe,
fun(_capture) -> gleam@int:multiply(_capture, Scalar) end
).
-file("src/vec/vec2i.gleam", 392).
?DOC(
" Returns the cross product of two vectors.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert Vec2(12, -34) |> cross(Vec2(2, 3)) == 104\n"
" ```\n"
).
-spec cross(vec@vec2:vec2(integer()), vec@vec2:vec2(integer())) -> integer().
cross(A, B) ->
(erlang:element(2, A) * erlang:element(3, B)) - (erlang:element(2, B) * erlang:element(
3,
A
)).
-file("src/vec/vec2i.gleam", 404).
?DOC(
" Returns the dot product of two vectors.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert Vec2(12, -34) |> dot(Vec2(2, 3)) == -78\n"
" ```\n"
).
-spec dot(vec@vec2:vec2(integer()), vec@vec2:vec2(integer())) -> integer().
dot(A, B) ->
_pipe = A,
_pipe@1 = multiply(_pipe, B),
_pipe@2 = vec@vec2:to_list(_pipe@1),
gleam@int:sum(_pipe@2).
-file("src/vec/vec2i.gleam", 416).
?DOC(
" Returns the projection of a vector on another vector.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert Vec2(12, -34) |> project(Vec2(2, 3)) == Vec2(-12, -18)\n"
" ```\n"
).
-spec project(vec@vec2:vec2(integer()), vec@vec2:vec2(integer())) -> vec@vec2:vec2(integer()).
project(A, B) ->
_pipe = B,
scale(_pipe, case dot(B, B) of
0 -> 0;
Gleam@denominator -> dot(A, B) div Gleam@denominator
end).
-file("src/vec/vec2i.gleam", 429).
?DOC(
" Returns a new vector resulting from sliding this vector along a plane\n"
" defined by the given normal vector.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert Vec2(12, -34) |> slide(Vec2(2, 3)) == -16\n"
" ```\n"
).
-spec slide(vec@vec2:vec2(integer()), vec@vec2:vec2(integer())) -> vec@vec2:vec2(integer()).
slide(A, B) ->
_pipe = A,
subtract(
_pipe,
begin
_pipe@1 = A,
project(_pipe@1, B)
end
).
-file("src/vec/vec2i.gleam", 442).
?DOC(
" Returns the reflection of a vector through a plane defined by the given\n"
" normal vector.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert Vec2(12, -34) |> reflect(Vec2(2, 3)) == Vec2(-36, -2)\n"
" ```\n"
).
-spec reflect(vec@vec2:vec2(integer()), vec@vec2:vec2(integer())) -> vec@vec2:vec2(integer()).
reflect(Vector, Normal) ->
_pipe = Vector,
_pipe@1 = project(_pipe, Normal),
_pipe@2 = scale(_pipe@1, 2),
subtract(_pipe@2, Vector).
-file("src/vec/vec2i.gleam", 455).
?DOC(
" Returns the mirror of a vector through a plane defined by the given normal\n"
" vector.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert Vec2(12, -34) |> mirror(Vec2(2, 3)) == Vec2(36, 2)\n"
" ```\n"
).
-spec mirror(vec@vec2:vec2(integer()), vec@vec2:vec2(integer())) -> vec@vec2:vec2(integer()).
mirror(Vector, Normal) ->
_pipe = Vector,
_pipe@1 = reflect(_pipe, Normal),
negate(_pipe@1).
-file("src/vec/vec2i.gleam", 467).
?DOC(
" Rotate a vector by an angle (in 90 degree steps).\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert Vec2(12, -34) |> rotate(1) == Vec2(34, 12)\n"
" ```\n"
).
-spec rotate(vec@vec2:vec2(integer()), integer()) -> vec@vec2:vec2(integer()).
rotate(Vector, Angle) ->
case begin
_pipe = Angle,
gleam@int:modulo(_pipe, 4)
end of
{ok, 1} ->
{vec2, - erlang:element(3, Vector), erlang:element(2, Vector)};
{ok, 2} ->
{vec2, - erlang:element(2, Vector), - erlang:element(3, Vector)};
{ok, 3} ->
{vec2, erlang:element(3, Vector), - erlang:element(2, Vector)};
_ ->
Vector
end.
-file("src/vec/vec2i.gleam", 487).
?DOC(
" Return the equivalent of `vector |> subtract(position) |> fun |> add(position)`.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert\n"
" Vec2(12, -34)\n"
" |> anchor_position(Vec2(10, 21), rotate(_, 1))\n"
" == Vec2(65, 23)\n"
" ```\n"
).
-spec anchor_position(
vec@vec2:vec2(integer()),
vec@vec2:vec2(integer()),
fun((vec@vec2:vec2(integer())) -> vec@vec2:vec2(integer()))
) -> vec@vec2:vec2(integer()).
anchor_position(Vector, Position, Fun) ->
_pipe = Vector,
_pipe@1 = subtract(_pipe, Position),
_pipe@2 = Fun(_pipe@1),
add(_pipe@2, Position).
-file("src/vec/vec2i.gleam", 506).
?DOC(
" Return the equivalent of `vector |> rotate(-angle) |> fun |> rotate(angle)`.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" assert\n"
" Vec2(12, -34)\n"
" |> anchor_rotation(1, add(_, Vec2(6, 9)))\n"
" == Vec2(3, -28)\n"
" ```\n"
).
-spec anchor_rotation(
vec@vec2:vec2(integer()),
integer(),
fun((vec@vec2:vec2(integer())) -> vec@vec2:vec2(integer()))
) -> vec@vec2:vec2(integer()).
anchor_rotation(Vector, Angle, Fun) ->
_pipe = Vector,
_pipe@1 = rotate(_pipe, - Angle),
_pipe@2 = Fun(_pipe@1),
rotate(_pipe@2, Angle).