X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=src%2Fhope_result.erl;h=feda5379c1e6ec36e506530547937928b79e82a9;hb=b79afea06befb5309f4a3f0388e587e17c484b83;hp=5d0ea7e42c40521a8a24f65b0fa0ce7f4701153c;hpb=ed9905af6fa1dba6f89759d6dbfc970426122bde;p=hope.git diff --git a/src/hope_result.erl b/src/hope_result.erl index 5d0ea7e..feda537 100644 --- a/src/hope_result.erl +++ b/src/hope_result.erl @@ -7,6 +7,8 @@ -export( [ pipe/2 + , lift_exn/1 + , lift_exn/2 ]). @@ -23,9 +25,42 @@ , Error :: any() , F :: fun((X) -> t(Ok, Error)) . -pipe([] , X) -> X; +pipe([], X) -> + {ok, X}; pipe([F|Fs], X) -> case F(X) of {error, _}=E -> E ; {ok, Y} -> pipe(Fs, Y) end. + +-spec lift_exn(F) -> G + when F :: fun((A)-> B) + , G :: fun((A)-> t(B, {Class, Reason :: any()})) + , Class :: error + | exit + | throw + . +lift_exn(F) when is_function(F, 1) -> + fun(X) -> + try + {ok, F(X)} + catch Class:Reason -> + {error, {Class, Reason}} + end + end. + +-spec lift_exn(F, Label) -> G + when F :: fun((A)-> B) + , G :: fun((A)-> t(B, {Label, {Class, Reason :: any()}})) + , Class :: error + | exit + | throw + . +lift_exn(F, Label) when is_function(F, 1) -> + fun(X) -> + try + {ok, F(X)} + catch Class:Reason -> + {error, {Label, {Class, Reason}}} + end + end.