X-Git-Url: https://git.xandkar.net/?p=hope.git;a=blobdiff_plain;f=src%2Fhope_option.erl;h=ab6eab775af29f9d6cae2fccdd638cbb25200402;hp=ad0adacd6831640ff5581a1e38f83c8324a135e2;hb=2497062cedae903b4f8dd00b82da386b0e4f9b62;hpb=e492ea132d3b73d2597fc8b832128dc40fed63ba diff --git a/src/hope_option.erl b/src/hope_option.erl index ad0adac..ab6eab7 100644 --- a/src/hope_option.erl +++ b/src/hope_option.erl @@ -1,27 +1,49 @@ -module(hope_option). --export_type([ t/1 - ]). --export([ put/2 - , get/2 - , map/2 - ]). +-export_type( + [ t/1 + ]). +-export( + [ put/2 + , get/2 + , map/2 + , iter/2 + , of_result/1 + ]). --type t(A) :: none | {some, A}. +-type t(A) :: + none + | {some, A} + . + +-spec put(A, fun((A) -> boolean())) -> + t(A). put(X, F) -> case F(X) of true -> {some, X} ; false -> none end. - +-spec get(t(A), Default :: A) -> + A. get({some, X}, _) -> X; get(none , Y) -> Y. - +-spec map(t(A), fun((A) -> (B))) -> + t(B). map({some, X}, F) -> {some, F(X)}; map(none , _) -> none. + +-spec iter(t(A), fun((A) -> (ok))) -> + ok. +iter({some, X}, F) -> ok = F(X); +iter(none , _) -> ok. + +-spec of_result(hope_result:t(A, _B)) -> + t(A). +of_result({ok, X}) -> {some, X}; +of_result({error, _}) -> none.