X-Git-Url: https://git.xandkar.net/?p=hope.git;a=blobdiff_plain;f=src%2Fhope_fun.erl;h=96a39cda7fdf7be7f8f79d2ae8d3bcaac859d77a;hp=c2443cee8b7efb721098b69a9dd6268eb3bfac68;hb=0b6ed6177fd85b5dd1b6ceadb9c2e2560c6597d2;hpb=a3173cf2c4cd3aa3b7da033cac6b2d9e9ccd492a diff --git a/src/hope_fun.erl b/src/hope_fun.erl index c2443ce..96a39cd 100644 --- a/src/hope_fun.erl +++ b/src/hope_fun.erl @@ -3,6 +3,9 @@ -export( [ id/1 , curry/1 + , compose/1 % alias for compose_right/1 + , compose_right/1 + , compose_left/1 ]). -spec id(A) -> @@ -22,3 +25,26 @@ curry(F, Args, 0) -> apply(F, lists:reverse(Args)); curry(F, Args, Arity) -> fun (X) -> curry(F, [X | Args], Arity - 1) end. + +-spec compose([fun((A) -> B)]) -> + fun((A) -> B). +compose(Fs) -> + compose_right(Fs). + +-spec compose_right([fun((A) -> B)]) -> + fun((A) -> B). +compose_right(Fs) -> + compose_given_fold(Fs, fun lists:foldr/3). + +-spec compose_left([fun((A) -> B)]) -> + fun((A) -> B). +compose_left(Fs) -> + compose_given_fold(Fs, fun lists:foldl/3). + + +%% ============================================================================ + +-spec compose_given_fold([fun((A) -> B)], fun((fun((A, B) -> C), B, [A]) -> C)) -> + fun((A) -> C). +compose_given_fold(Fs, Fold) -> + fun (X) -> Fold(fun (F, Y) -> F(Y) end, X, Fs) end.