Current section
Files
Jump to
Current section
Files
src/fp.erl
-module(fp).
-compile([no_auto_import, nowarn_unused_vars]).
-export([fmap/3, new_functor_instance/1, list_functor_instance/0, option_functor_instance/0, result_functor_instance/0, function_functor_instance/0, fmap_list/2, fmap_option/2, fmap_result/2, fmap_function/2, pure/2, ap/3, list_applicative_instance/0, option_applicative_instance/0, result_applicative_instance/0, pure_list/1, pure_option/1, pure_result/1, ap_list/2, ap_option/2, ap_result/2]).
-export_type([functor_instance/4, applicative_instance/5]).
-type functor_instance(EUG, EUH, EUI, EUJ) :: {functor_instance,
fun((fun((EUG) -> EUH), EUI) -> EUJ)}.
-type applicative_instance(EUK, EUL, EUM, EUN, EUO) :: {applicative_instance,
fun(() -> functor_instance(EUK, EUL, EUM, EUN)),
fun((EUK) -> EUM),
fun((EUO, EUM) -> EUN)}.
-spec fmap(
fun((EUP) -> EUQ),
EUR,
fun(() -> functor_instance(EUP, EUQ, EUR, EUS))
) -> EUS.
fmap(Lhs, Rhs, Instance) ->
(erlang:element(2, Instance()))(Lhs, Rhs).
-spec new_functor_instance(fun((EUX, fun((EUY) -> EUZ)) -> EVA)) -> functor_instance(EUY, EUZ, EUX, EVA).
new_functor_instance(Fmapper) ->
{functor_instance, gleam@function:flip(Fmapper)}.
-spec list_functor_instance() -> functor_instance(EVF, EVG, list(EVF), list(EVG)).
list_functor_instance() ->
new_functor_instance(fun gleam@list:map/2).
-spec option_functor_instance() -> functor_instance(EVN, EVO, gleam@option:option(EVN), gleam@option:option(EVO)).
option_functor_instance() ->
new_functor_instance(fun gleam@option:map/2).
-spec result_functor_instance() -> functor_instance(EVV, EVW, {ok, EVV} |
{error, EVX}, {ok, EVW} | {error, EVX}).
result_functor_instance() ->
new_functor_instance(fun gleam@result:map/2).
-spec function_functor_instance() -> functor_instance(EWG, EWH, fun((EWI) -> EWG), fun((EWI) -> EWH)).
function_functor_instance() ->
new_functor_instance(fun gleam@function:compose/2).
-spec fmap_list(fun((EWN) -> EWO), list(EWN)) -> list(EWO).
fmap_list(Lhs, Rhs) ->
fmap(Lhs, Rhs, fun list_functor_instance/0).
-spec fmap_option(fun((EWR) -> EWS), gleam@option:option(EWR)) -> gleam@option:option(EWS).
fmap_option(Lhs, Rhs) ->
fmap(Lhs, Rhs, fun option_functor_instance/0).
-spec fmap_result(fun((EWV) -> EWW), {ok, EWV} | {error, EWX}) -> {ok, EWW} |
{error, EWX}.
fmap_result(Lhs, Rhs) ->
fmap(Lhs, Rhs, fun result_functor_instance/0).
-spec fmap_function(fun((EXC) -> EXD), fun((EXE) -> EXC)) -> fun((EXE) -> EXD).
fmap_function(Lhs, Rhs) ->
fmap(Lhs, Rhs, fun function_functor_instance/0).
-spec pure(EXF, fun(() -> applicative_instance(EXF, any(), EXH, any(), any()))) -> EXH.
pure(X, Instance) ->
(erlang:element(3, Instance()))(X).
-spec ap(EXP, EXQ, fun(() -> applicative_instance(any(), any(), EXQ, EXT, EXP))) -> EXT.
ap(Lhs, Rhs, Instance) ->
(erlang:element(4, Instance()))(Lhs, Rhs).
-spec list_applicative_instance() -> applicative_instance(EXZ, EYA, list(EXZ), list(EYA), list(fun((EXZ) -> EYA))).
list_applicative_instance() ->
{applicative_instance,
fun list_functor_instance/0,
fun(X) -> [X] end,
fun(Lhs, Rhs) ->
_pipe = Lhs,
gleam@list:flat_map(
_pipe,
fun(F) -> fmap(F, Rhs, fun list_functor_instance/0) end
)
end}.
-spec option_applicative_instance() -> applicative_instance(EYJ, EYK, gleam@option:option(EYJ), gleam@option:option(EYK), gleam@option:option(fun((EYJ) -> EYK))).
option_applicative_instance() ->
{applicative_instance,
fun option_functor_instance/0,
fun(Field@0) -> {some, Field@0} end,
fun(Lhs, Rhs) ->
_pipe = Lhs,
gleam@option:then(
_pipe,
fun(F) -> fmap(F, Rhs, fun option_functor_instance/0) end
)
end}.
-spec result_applicative_instance() -> applicative_instance(EYT, EYU, {ok, EYT} |
{error, EYV}, {ok, EYU} | {error, EYV}, {ok, fun((EYT) -> EYU)} |
{error, EYV}).
result_applicative_instance() ->
{applicative_instance,
fun result_functor_instance/0,
fun(Field@0) -> {ok, Field@0} end,
fun(Lhs, Rhs) ->
_pipe = Lhs,
gleam@result:then(
_pipe,
fun(F) -> fmap(F, Rhs, fun result_functor_instance/0) end
)
end}.
-spec pure_list(EZH) -> list(EZH).
pure_list(X) ->
pure(X, fun list_applicative_instance/0).
-spec pure_option(EZJ) -> gleam@option:option(EZJ).
pure_option(X) ->
pure(X, fun option_applicative_instance/0).
-spec pure_result(EZL) -> {ok, EZL} | {error, any()}.
pure_result(X) ->
pure(X, fun result_applicative_instance/0).
-spec ap_list(list(fun((EZP) -> EZQ)), list(EZP)) -> list(EZQ).
ap_list(Lhs, Rhs) ->
ap(Lhs, Rhs, fun list_applicative_instance/0).
-spec ap_option(
gleam@option:option(fun((EZU) -> EZV)),
gleam@option:option(EZU)
) -> gleam@option:option(EZV).
ap_option(Lhs, Rhs) ->
ap(Lhs, Rhs, fun option_applicative_instance/0).
-spec ap_result(
{ok, fun((EZZ) -> FAA)} | {error, FAB},
{ok, EZZ} | {error, FAB}
) -> {ok, FAA} | {error, FAB}.
ap_result(Lhs, Rhs) ->
ap(Lhs, Rhs, fun result_applicative_instance/0).