Current section

Files

Jump to
datum src category datum_cat_f.erl
Raw

src/category/datum_cat_f.erl

%% @doc
%% category pattern: the category of ordinal functions
-module(datum_cat_f).
%% (/=)
-export(['/='/1]).
%% (.) operation
-export(['.'/3, chain/1, curry/1]).
%% transformers
-export([unit/1, fail/1, sequence/1, eitherT/1]).
%%
%%
'/='(Arrow) ->
Arrow.
%%
%% compose function(s) using AST notation
%%
%% f(_) . g(_) -> g(f(_))
%%
'.'(_, G, {call, _, _, _} = F) ->
datum_cat:cc_bind_var(F, G);
'.'(_, G, {generate, Ln, VarS, F}) ->
dot_arrow_state(Ln, VarS, F, G).
%%
%%
dot_arrow_state(Ln, VarX, F, G) ->
{'case', Ln, F, [
{clause, Ln,
[VarX],
[],
[G]
}
]}.
%%
%% return dot-composition chain.
chain(Expr) ->
Expr.
%%
%% curry do-composition chain into partial application
curry({_, Ln, _, _} = Expr) ->
VarX = datum_cat:uuid(),
{'fun', Ln,
{clauses, [
{clause, Ln,
[{var, Ln, VarX}],
[],
[datum_cat:cc_bind_var({var, Ln, VarX}, Expr)]
}
]}
}.
%%
%%
unit(X) ->
X.
%%
%%
fail(X) ->
throw(X).
%%
%%
sequence(Seq) ->
Seq.
%%
%%
-spec eitherT( datum:either(_) ) -> datum:option(_).
eitherT({ok, X}) ->
X;
eitherT({error, _}) ->
undefined.