Packages

A porting of some parts of fp-ts to Gleam

Current section

Files

Jump to
fp2 src fp2@codec.erl
Raw

src/fp2@codec.erl

-module(fp2@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(ENE) :: {codec,
fun((ENE) -> gleam@json:json()),
fun((gleam@dynamic:dynamic()) -> {ok, ENE} |
{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(fp2@defunc:defunc1(ENN, ENO), codec(ENN)) -> codec(ENO).
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(fp2@defunc:defunc2(ENT, ENU, ENV), codec(ENT), codec(ENU)) -> codec(ENV).
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(
fp2@defunc:defunc3(EOC, EOD, EOE, EOF),
codec(EOC),
codec(EOD),
codec(EOE)
) -> codec(EOF).
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}.