Current section
Files
Jump to
Current section
Files
src/gleam_value.erl
-module(gleam_value).
-compile([no_auto_import, nowarn_unused_vars]).
-export([from_list/1, empty_number/0, empty_string/0, empty_map/0, from_string/1, from_float/1, from_int/1, empty_value/1, gloom_type/1, length/1, nothing/1, something/1, everything/1, insert/3, ensure_map_value/1, get/2, set_property/3, ensure_object_value/1, get_property/2, insert_value/2, nothing_value/1, something_value/1, everything_value/1]).
-export_type([gloom_object/0, gleam_value/0]).
-type gloom_object() :: {gloom_object,
binary(),
dtype:gloom_type(),
affinity:gloom_affinity(),
gleam_value()}.
-type gleam_value() :: {int_value, integer()} |
{float_value, float()} |
{string_value, binary()} |
{map_value, gleam@map:map_(gleam_value(), gleam_value())} |
{object_value, gloom_object()}.
-spec from_list(list({gleam_value(), gleam_value()})) -> gleam_value().
from_list(List) ->
{map_value, gleam@map:from_list(List)}.
-spec empty_number() -> gleam_value().
empty_number() ->
{float_value, 0.0}.
-spec empty_string() -> gleam_value().
empty_string() ->
{string_value, <<""/utf8>>}.
-spec empty_map() -> gleam_value().
empty_map() ->
{map_value, gleam@map:new()}.
-spec from_string(binary()) -> gleam_value().
from_string(String) ->
{string_value, String}.
-spec from_float(float()) -> gleam_value().
from_float(Float) ->
{float_value, Float}.
-spec from_int(integer()) -> gleam_value().
from_int(Int) ->
{int_value, Int}.
-spec empty_value(dtype:gloom_type()) -> gleam_value().
empty_value(Datatype) ->
case Datatype of
number ->
empty_number();
string ->
empty_string();
table ->
empty_map()
end.
-spec gloom_type(gleam_value()) -> dtype:gloom_type().
gloom_type(Gleam_value) ->
case Gleam_value of
{int_value, _} ->
number;
{float_value, _} ->
number;
{string_value, _} ->
string;
{map_value, _} ->
table;
{object_value, Object} ->
erlang:element(3, Object)
end.
-spec length(gleam_value()) -> integer().
length(Value) ->
case Value of
{int_value, Gleam_value} ->
_pipe = Gleam_value,
_pipe@1 = gleam@int:to_string(_pipe),
gleam@string:length(_pipe@1);
{float_value, Gleam_value@1} ->
_pipe@2 = Gleam_value@1,
_pipe@3 = gleam@float:to_string(_pipe@2),
gleam@string:length(_pipe@3);
{string_value, Gleam_value@2} ->
_pipe@4 = Gleam_value@2,
gleam@string:length(_pipe@4);
{map_value, Gleam_value@3} ->
_pipe@5 = Gleam_value@3,
gleam@map:size(_pipe@5);
{object_value, Object} ->
_pipe@6 = erlang:element(5, Object),
length(_pipe@6)
end.
-spec nothing(dtype:gloom_type()) -> gloom_object().
nothing(Datatype) ->
{gloom_object, <<"object"/utf8>>, Datatype, nothing, empty_map()}.
-spec something(dtype:gloom_type()) -> gloom_object().
something(Datatype) ->
{gloom_object, <<"object"/utf8>>, Datatype, something, empty_map()}.
-spec everything(dtype:gloom_type()) -> gloom_object().
everything(Datatype) ->
{gloom_object, <<"object"/utf8>>, Datatype, everything, empty_map()}.
-spec insert(gleam_value(), gleam_value(), gleam_value()) -> gleam_value().
insert(Maybe_map, Key, Value) ->
case Maybe_map of
{map_value, Gleam_map} ->
{map_value, gleam@map:insert(Gleam_map, Key, Value)};
_ ->
_pipe = ensure_map_value(Maybe_map),
insert(_pipe, Key, Value)
end.
-spec ensure_map_value(gleam_value()) -> gleam_value().
ensure_map_value(Value) ->
case Value of
{map_value, _} ->
Value;
_ ->
Empty_gloom_value = begin
_pipe = Value,
_pipe@1 = gloom_type(_pipe),
empty_value(_pipe@1)
end,
_pipe@2 = empty_map(),
insert(_pipe@2, Empty_gloom_value, Value)
end.
-spec get(gleam_value(), gleam_value()) -> gleam_value().
get(Maybe_map, Key) ->
_assert_subject = ensure_map_value(Maybe_map),
{map_value, Gleam_map} = case _assert_subject of
{map_value, _} -> _assert_subject;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _assert_fail,
module => <<"gleam_value"/utf8>>,
function => <<"get"/utf8>>,
line => 149})
end,
case gleam@map:get(Gleam_map, Key) of
{ok, Value} ->
Value;
{error, nil} ->
empty_number()
end.
-spec set_property(gloom_object(), gleam_value(), gleam_value()) -> gloom_object().
set_property(Object, Key, Value) ->
erlang:setelement(
5,
Object,
begin
_pipe = erlang:element(5, Object),
insert(_pipe, Key, Value)
end
).
-spec ensure_object_value(gleam_value()) -> gleam_value().
ensure_object_value(Value) ->
case Value of
{object_value, _} ->
Value;
_ ->
_pipe = Value,
_pipe@1 = gloom_type(_pipe),
_pipe@2 = something(_pipe@1),
_pipe@4 = set_property(
_pipe@2,
begin
_pipe@3 = <<"value"/utf8>>,
from_string(_pipe@3)
end,
Value
),
{object_value, _pipe@4}
end.
-spec get_property(gloom_object(), gleam_value()) -> gloom_object().
get_property(Object, Key) ->
Raw_value = begin
_pipe = erlang:element(5, Object),
get(_pipe, Key)
end,
case Raw_value of
{object_value, Value} ->
Value;
_ ->
nothing(erlang:element(3, Object))
end.
-spec insert_value(gleam_value(), gleam_value()) -> gleam_value().
insert_value(Hopefully_map, Value) ->
Key = {string_value, <<"value"/utf8>>},
_pipe = Hopefully_map,
insert(_pipe, Key, Value).
-spec nothing_value(gleam_value()) -> gloom_object().
nothing_value(Value) ->
{gloom_object,
<<"object"/utf8>>,
begin
_pipe = Value,
gloom_type(_pipe)
end,
nothing,
begin
_pipe@1 = empty_map(),
insert_value(_pipe@1, Value)
end}.
-spec something_value(gleam_value()) -> gloom_object().
something_value(Value) ->
{gloom_object,
<<"object"/utf8>>,
begin
_pipe = Value,
gloom_type(_pipe)
end,
something,
begin
_pipe@1 = empty_map(),
insert_value(_pipe@1, Value)
end}.
-spec everything_value(gleam_value()) -> gloom_object().
everything_value(Value) ->
{gloom_object,
<<"object"/utf8>>,
begin
_pipe = Value,
gloom_type(_pipe)
end,
everything,
begin
_pipe@1 = empty_map(),
insert_value(_pipe@1, Value)
end}.