Packages

A porting of some parts of fp-ts to Gleam

Current section

Files

Jump to
fp_gl src fp_gl@codec.erl
Raw

src/fp_gl@codec.erl

-module(fp_gl@codec).
-compile(no_auto_import).
-export([int/0, float/0, string/0, bool/0, codec1/2, codec2/3, codec3/4]).
-export_type([codec/1]).
-type codec(EQH) :: {codec,
fun((EQH) -> gleam@json:json()),
fun((gleam@dynamic:dynamic()) -> {ok, EQH} |
{error, list(gleam@dynamic:decode_error())})}.
-spec int() -> codec(integer()).
int() ->
{codec, fun gleam@json:int/1, fun gleam@dynamic:int/1}.
-spec float() -> codec(float()).
float() ->
{codec, fun gleam@json:float/1, fun gleam@dynamic:float/1}.
-spec string() -> codec(binary()).
string() ->
{codec, fun gleam@json:string/1, fun gleam@dynamic:string/1}.
-spec bool() -> codec(boolean()).
bool() ->
{codec, fun gleam@json:bool/1, fun gleam@dynamic:bool/1}.
-spec codec1(fp_gl@defunc:defunc1(EQQ, EQR), codec(EQQ)) -> codec(EQR).
codec1(Defunc, Codec1) ->
{codec,
fun(Value) ->
Value@1 = (erlang:element(3, Defunc))(Value),
{Name1} = erlang:element(4, Defunc),
_pipe = [{Name1,
(erlang:element(2, Codec1))(erlang:element(1, Value@1))}],
gleam@json:object(_pipe)
end,
fun(Dyn) ->
{Name1@1} = erlang:element(4, Defunc),
_pipe@1 = Dyn,
_pipe@2 = (gleam@dynamic:field(Name1@1, erlang:element(3, Codec1)))(
_pipe@1
),
gleam@result:map(_pipe@2, erlang:element(2, Defunc))
end}.
-spec codec2(fp_gl@defunc:defunc2(EQW, EQX, EQY), codec(EQW), codec(EQX)) -> codec(EQY).
codec2(Defunc, Codec1, Codec2) ->
{codec,
fun(Value) ->
Value@1 = (erlang:element(3, Defunc))(Value),
{Name1, Name2} = erlang:element(4, Defunc),
_pipe = [{Name1,
(erlang:element(2, Codec1))(erlang:element(1, Value@1))},
{Name2,
(erlang:element(2, Codec2))(erlang:element(2, Value@1))}],
gleam@json:object(_pipe)
end,
fun(Dyn) ->
{Name1@1, Name2@1} = erlang:element(4, Defunc),
_pipe@1 = Dyn,
(gleam@dynamic:decode2(
erlang:element(2, Defunc),
gleam@dynamic:field(Name1@1, erlang:element(3, Codec1)),
gleam@dynamic:field(Name2@1, erlang:element(3, Codec2))
))(_pipe@1)
end}.
-spec codec3(
fp_gl@defunc:defunc3(ERF, ERG, ERH, ERI),
codec(ERF),
codec(ERG),
codec(ERH)
) -> codec(ERI).
codec3(Defunc, Codec1, Codec2, Codec3) ->
{codec,
fun(Value) ->
Value@1 = (erlang:element(3, Defunc))(Value),
{Name1, Name2, Name3} = erlang:element(4, Defunc),
_pipe = [{Name1,
(erlang:element(2, Codec1))(erlang:element(1, Value@1))},
{Name2,
(erlang:element(2, Codec2))(erlang:element(2, Value@1))},
{Name3,
(erlang:element(2, Codec3))(erlang:element(3, Value@1))}],
gleam@json:object(_pipe)
end,
fun(Dyn) ->
{Name1@1, Name2@1, Name3@1} = erlang:element(4, Defunc),
_pipe@1 = Dyn,
(gleam@dynamic:decode3(
erlang:element(2, Defunc),
gleam@dynamic:field(Name1@1, erlang:element(3, Codec1)),
gleam@dynamic:field(Name2@1, erlang:element(3, Codec2)),
gleam@dynamic:field(Name3@1, erlang:element(3, Codec3))
))(_pipe@1)
end}.